2012-01-16 11 views
0

以下のコードは2つのスレッドを作成します。 1つは入力を受け入れ、もう1つはテキストを同時に印刷する。私がこのトピックで読んだことから、グローバル変数は伝統的なC++コードでは悪いフォームとみなされます。しかし、私はそれらなしで入出力を同時に行う方法を考えることはできません。このコードでグローバル変数を削除するにはどうすればよいですか?

私はこれら2つのブール値のグローバル変数をコードから削除するにはどうすればよいですか?

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に4番目のパラメータを使用して、スレッド関数が受け取るポインタを通じてそれらを変更できるようにします。 (スタイル用の調整)

例:

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

はい、グローバル変数は良いものではありませんが、常にではありません。私はあなたが2つのスレッドを1つは入力を読み込み、もう1つは入力を書き込むことを望んでいると思われます。これに対して、両方のスレッドで共有できるグローバル変数が必要なので、入力スレッドはグローバル変数と出力スレッドグローバル変数からデータを読み取ることができます。ここでは両方のスレッドを同期させる必要があります。

関連する問題