2012-01-16 4 views
0

아래 코드는 두 개의 스레드를 만듭니다. 하나는 입력을 허용하고 다른 하나는 텍스트를 동시에 인쇄합니다. 주제에서 읽은 것부터 글로벌 변수는 전통적인 C++ 코드에서 나쁜 형태로 간주됩니다. 그러나 나는 그것들없이 입출력을 동시에 할 수있는 방법을 생각할 수 없다.이 코드에서 전역 변수를 제거하려면 어떻게합니까?

내 코드에서이 두 부울 전역 변수를 제거하려면 어떻게해야합니까?

bool input_done = 1; 
bool output_done = 1; 

void* input(void* ptr) 
{ 
    char msg[256]; 
    cin.getline(msg,256); 
    cout << msg << endl; 
    input_done = 1; 
    pthread_exit(NULL); 
} 
void* output(void* ptr) 
{ 
    cout << "Hello World" << endl; 
    for(long int x=0;x<1000000000;x++) {} 
    output_done = 1; 
    pthread_exit(NULL); 
} 

int main() 
{ 
    while(1) 
    { 

     pthread_t t1,t2; 
     if (input_done) 
     { 
      pthread_create(&t1,NULL,input,NULL); 
      input_done = 0; 
     } 
     if (output_done) 
     { 
      pthread_create(&t2,NULL,output,NULL); 
      output_done = 0; 
     } 
    } 

} 

답변

3

사용하지 않는 스레드 기능에 전달되는 포인터가 있습니다. 포인터를 변수에 전달하고 포인터를 통해 액세스하면 함수 main 또는 그 밖의 다른 곳에서 스택에 변수를 할당 할 수 있습니다.

따라서, 예를 들어 당신의 output 기능은

void* output(void* output_done) 
{ 
    cout << "Hello World" << endl; 
    for(long int x=0;x<1000000000;x++) {} 
    *((bool*)output_done) = 1; 
    pthread_exit(NULL); 
} 

pthread_create 호출과 같이 표시됩니다

int main() 
{ 
    bool output_done = 1; 

    // ... 

    if (output_done) 
    { 
     pthread_create(&t2,NULL,output, &output_done); 
     output_done = 0; 
    } 
+0

'void *'에 캐스팅했는지 확인하십시오. 그렇지 않으면 컴파일되지 않습니다. C++에서는'void *'에 대한 암시 적 캐스팅이 없습니다. –

+1

아니요. 포인터는 암시 적으로'void *'(C++ 표준 §4.10.2). 'void *'에서'T *'로의 변환은 실제로 C++에서는 불법이고 C에서는 유효합니다. – n0rd

+0

네,하지만'void *'에서'T *'로 넘어 가지 않으면'T *'에서 'void *'는 암시 적으로 허용되지 않습니다. 그래서'malloc'의 반환 값을 캐스팅해야합니다. –

2

maininput_doneoutput_done 지역 변수를 확인하여 스레드 함수에 대한 포인터를 전달 네 번째 매개 변수를 pthread_create으로 사용하고 스레드 함수가 수신 포인터를 통해 스레드 함수를 수정하도록합니다. (스타일 조정)

예 :

void* input(void* ptr) 
{ 
    char msg[256]; 
    cin.getline(msg, 256); 

    cout << msg << endl; 

    *(bool*)ptr = true; 
    pthread_exit(NULL); 
} 
void* output(void* ptr) 
{ 
    cout << "Hello World" << endl; 

    for(long int x = 0; x < 1000000000; ++x) { } 

    *(bool*)ptr = true; 
    pthread_exit(NULL); 
} 

int main() 
{ 
    bool input_done = true; 
    bool output_done = true; 

    while (true) 
    { 
     pthread_t t1, t2; 

     if (input_done) 
     { 
      pthread_create(&t1, NULL, input, (void*)&input_done); 
      input_done = false; 
     } 

     if (output_done) 
     { 
      pthread_create(&t2, NULL, output, (void*)&output_done); 
      output_done = false; 
     } 
    } 
} 
0

예, 전역 변수가 잘되지 않습니다 항상은 아니지만. 두 스레드가 하나의 입력을 읽고 다른 스레드는 입력을 쓰고 싶습니다. 두 스레드가 공유 할 수있는 전역 변수가 필요하기 때문에 입력 스레드가 전역 변수와 출력 스레드에 데이터를 쓸 수 있습니다. 전역 변수에서 데이터를 읽을 수 있습니다. 여기서 두 스레드를 동기화해야합니다.

관련 문제