web-dev-qa-db-ja.com

デタッチされたpthreadが生きているかどうかを確認するにはどうすればよいですか?

切り離されたpthreadがまだ生きているであるかどうかを判断するにはどうすればよいですか?

スレッドとの通信チャネル(スレッドから外側を指す単方向キュー)がありますが、スレッドがdiesあえぎなしである場合はどうなりますか?

プロセスsignalsの使用を辞任する必要がありますか、それともスレッドの活気のためにprobeを使用できますか?

25
jldupont

結合可能な(つまり、デタッチされていない)pthreadの場合、次のように pthread_kill を使用できます。

int ret = pthread_kill(YOUR_PTHREAD_ID, 0);

[〜#〜] esrch [〜#〜]の値を取得した場合は、スレッドが停止している可能性があります。

ただし、これはデタッチされたpthreadには適用されません。これは、スレッドIDが終了した後、別のスレッドで再利用できるためです。

コメントから:

スレッドが切り離されて生きていない場合、pthread_tは無効であるため、答えは間違っています。それをpthread_killに渡すことはできません。たとえば、解放された構造体へのポインタである可能性があり、プログラムがクラッシュします。 POSIXは、「準拠する実装は、存続期間が終了した後、スレッドIDを自由に再利用できます。アプリケーションが存続期間が終了したスレッドIDを使用しようとすると、動作は定義されません」と述べています。 –ありがとう@DavidSchwartz

20

この質問は、避けられない競合状態の設計を前提としています。

おそらく、あなたはこのようなことをするつもりです:

  1. スレッドが生きているかどうかを確認します
  2. スレッドからのメッセージを待つ

問題は、このシーケンスがアトミックではなく、修正できないことです。具体的には、チェックしているスレッドがステップ(1)とステップ(2)の間に停止した場合はどうなりますか?

競合状態は悪です。まれな競合状態が2倍になります。信頼性が90%で、信頼性が99.999%の何かを紙に書くことは、あなたが下すことができる最悪の決定の1つです。

あなたの質問に対する正しい答えは「それをしないでください」です。代わりに、スレッドがランダムに停止しないようにアプリケーションを修正してください。

それが不可能で、一部のスレッドがクラッシュする傾向があり、それから回復する必要がある場合...デザインに根本的な欠陥があるため、スレッドを使用しないでください。その信頼できないものを別のプロセスに置き、代わりにパイプを使用して通信します。プロセスデスはファイル記述子を閉じ、もう一方の端が閉じられているパイプを読み取ると、明確に定義され、簡単に検出され、レースのない動作が行われます。

8
Nemo

すでにデッドスレッドにシグナルを送信する場合、これはおそらく未定義の動作です。アプリケーションがクラッシュする可能性があります。 http://sourceware.org/bugzilla/show_bug.cgi?id=4509 および http://udrepper.livejournal.com/16844.html を参照してください。

5
karsten