24

マルチスレッド サーバーのシャットダウンをコーディングしています。すべてがうまくいけば、すべてのスレッドが独自に終了しますが、スレッドがスタックする可能性がわずかにあります。この場合、非ブロック結合があると便利です。だから私はすることができました。

ノンブロッキングの pthread_join を行う方法はありますか? ある種の時限参加も良いでしょう。

このようなもの:

foreach スレッド
  nb_pthread_join();
    まだ実行中の場合
      pthread_cancel();

ノンブロッキング結合が役立つケースは他にもあると思います。

そのような関数はないように思われるので、既に回避策をコーディングしましたが、私が望むほど単純ではありません。

4

8 に答える 8

26

Linuxでアプリケーションを実行している場合は、次のことを知りたいと思うかもしれません。

int pthread_tryjoin_np(pthread_t thread, void **retval);

int pthread_timedjoin_np(pthread_t thread, void **retval,
                                const struct timespec *abstime);

接尾辞が示すように、「np」は「非ポータブル」を意味するので注意してください。ただし、これらはPOSIX標準のgnu拡張機能ではありませんが、便利です。

マニュアルページへのリンク

于 2009-08-07T13:25:43.290 に答える
11

'pthread_join'メカニズムは、必要なことを正確に実行する場合に使用すると便利です。それはあなたが自分でできないことは何もしません、そしてそれがあなたが望むものと正確に一致しない場合、あなたが望むものを正確にコーディングします。

スレッドが終了したかどうかを実際に気にする必要がある本当の理由はありません。気になるのは、スレッドが行っていた作業が完了したかどうかです。それを伝えるために、スレッドにそれが機能していることを示すために何かをさせます。それをどのように行うかは、スレッドが何をしているかに大きく依存する特定の問題に理想的なものに依存します。

考え方を変えることから始めましょう。スタックするのはスレッドではなく、スレッドが行っていたことがスタックするのです。

于 2011-09-23T23:28:49.993 に答える
3

QNX用に開発している場合は、pthread_timedjoin()関数を使用できます。

それ以外の場合は、たとえば子スレッドが完了したことをセマフォに通知することで、pthread_join()を実行し、親スレッドに警告する別のスレッドを作成できます。この個別のスレッドは、pthread_join()から取得したものを返すことができ、子がいつ完了するかだけでなく、どの値を返すかを親スレッドが決定できるようにします。

于 2008-09-17T08:55:06.247 に答える
1

答えは、なぜこれをしたいかによって異なります。たとえば、単にデッド スレッドをクリーンアップしたい場合は、ループして結合する "デッド スレッド クリーナー" スレッドを用意するのがおそらく最も簡単です。

于 2008-09-16T15:24:51.483 に答える
1

他の人が指摘しているように、標準の pthread ライブラリで利用できるノンブロッキングの pthread_join はありません。

ただし、あなたが述べた問題(プログラムのシャットダウン時にすべてのスレッドが終了したことを保証しようとする)を考えると、そのような関数は必要ありません。これを簡単に行うことができます:

int killed_threads = 0;
for(i = 0; i < num_threads; i++) {
   int return = pthread_cancel(threads[i]);
   if(return != ESRCH)
      killed_threads++;
}
if(killed_threads)
    printf("%d threads did not shutdown properly\n", killed_threads)
else
    printf("All threads exited successfully");

すべてのスレッド (終了しているかどうかに関係なく) で pthread_cancel を呼び出すことに問題はないため、すべてのスレッドに対して呼び出してもブロックされず、スレッドの終了 (クリーンかどうか) が保証されます。

これは「単純な」回避策として認められるはずです。

于 2008-09-17T14:25:42.147 に答える
1

timed はありませんpthread_joinが、条件付きで他のスレッドがブロックされるのを待っている場合は、pthread_cond_timed_wait代わりにtimed を使用できますpthread_cond_wait

于 2008-09-17T08:15:58.260 に答える
1

正確な意味はわかりませんが、本当に必要なのは待機と通知のメカニズムだと思います。

要するに、これがどのように機能するかです: タイムアウトで条件が満たされるのを待ちます。次の場合、待機は終了します。

  • タイムアウトが発生する、または
  • 条件が満たされている場合。

これをループに入れて、ロジックにインテリジェンスを追加できます。Pthreads に関連して私が見つけた最良のリソースは、このチュートリアルです: POSIX Threads Programming ( https://computing.llnl.gov/tutorials/pthreads/ )。

また、Pthreads に時限結合用の API がないことにも非常に驚いています。

于 2008-09-16T15:50:08.553 に答える
0

非ブロッキングとして開かれたパイプにバイトをプッシュして、完了時に他のスレッドに通知し、非ブロッキング読み取りを使用してパイプのステータスを確認できます。

于 2008-09-16T15:20:16.800 に答える