0

私の問題では、pthread_create()を使用してpthreadを作成します(myThreadなど)。

これらは両方とも、myThreadがソケットからの読み取りを停止するように指示するために、メインスレッドに対して「done」という共通の変数を共有します。

私のpthreadには、ループがあります。

// done is a common variable
while (!done && socket->read(&buffer) == OK) {
    // do something....
}

時々、myThreadにソケットからの読み取りを停止するように指示したいので、次のようにします。

done = true;
  void *test;
    pthread_join(myThread, &test);

これにより競合状態が発生しますか?つまり、myThreadは、読み取り呼び出しでブロックされる前に、メインスレッドが「done」の値を更新するのを認識しませんか?

4

1 に答える 1

0

競合状態を回避するために、あるスレッドで変数を書き込み、別のスレッドで変数を読み取るには、同期(ミューテックスなど)が必要です。

これが実際のソケットであり、奇妙なオブジェクトではない場合はshutdown()、ファイル記述子を有効にしたまま、接続を切断してブロックされたスレッドをウェイクアップするように呼び出すことを検討してください。accept()呼び出しでブロックされたスレッドをウェイクアップするを参照してください。読み取りが失敗すると、myThreadはミューテックスをロックし、完了した変数をチェックします。

他の方法にはpoll()、シャットダウンメッセージを配信するためのソケットとパイプの呼び出しが含まれます。

于 2012-07-07T22:42:16.910 に答える