2011-01-02 8 views
4

POSIXスレッドインターフェイスでは、指定されたスレッドが終了するまでブロックするのにpthread_join(thread)を使用できます。pthreads - スレッドのグループに参加し、終了するのを待ちます。

子スレッドが終了するまで実行をブロックできるような機能はありますか?

これは私がこれを行うにはPOSIXスレッド・インタフェースのいずれかの機能がないと思う子スレッドではなくプロセス

+0

私は、他の人が言っているように、これには条件変数が必要だと思います。しかし、関連する同期の問題については、障壁を読みたいかもしれません。彼らは、いくつかの状況では十分であるが、他の状況では十分でない、この種の待ち時間に対してはるかに単純なインターフェースを提供する。 –

答えて

7

これはpthreads自体からは直接できないと思いますが、かなり簡単に回避できます。

pthreads APIを使用すると、pthread_cond_waitと友人が「条件」を設定して待機することができます。スレッドが終了しようとしているときに、待機中のスレッドをスリープ解除するための条件を通知します。

もう1つの方法は、パイプをpipeで作成し、スレッドが終了するときにパイプにwriteを作成することです。メインスレッドがパイプの他端で待機して、selectpollepoll、またはそれらのお気に入りのバリアントのいずれかを持つようにします。

新しいバージョンのLinuxには、同じことを行うための "eventfds"も含まれています(man eventfdを参照)。ただし、最近追加されたことに注意してください。 POSIXではないことに注意してください。これはLinuxのみであり、あなたが合理的に最新のものであれば利用可能です。 (2.6.22またはそれ以上)

私は、このAPIがファイルディスクリプタと同様のものを扱うように設計されていない理由を、個人的には常に疑問に思っています。それは私だったら、彼らは「eventables」になるだろう、とあなたはselectファイル、スレッド、タイマー...

+1

"私があれば、彼らは"イベント "となり、ファイル、スレッド、タイマーを選択することができます。 +1:WinAPIは実質的にすべての点で 'WaitOnSingleObject'または' WaitOnMultipleObjects'を呼び出すことができます。 –

2

に適用できる以外、wait() UNIXシステムコールと同様です。

独自のバージョンを作成する必要があります(例: mutexと条件変数によって保護されるフラグの配列(スレッドごとに1つのフラグ)。 "pthread_exit()"の直前で各スレッドはmutexを獲得し、そのフラグをセットしてから "pthread_cond_signal()"を実行します。メインスレッドはシグナルを待ってから、フラグの配列を調べて、どのスレッドに参加するかを決定します(それまでに複数のスレッドが参加する可能性があります)。

0

あなたがカスタマイズのpthread条件変数ずつ実装する必要がある可能性があり:pthread_cond_signalをpthread_cond_waitのを()、()/はpthread_cond_broadcast ()。