2016-06-16 12 views
1

私はPOSIXスレッドの実装が比較的新しいので、わからないコーナーケースの動作があります。pthread_detachは既存の結合子がある場合の動作

私の理解によれば、結合可能なpthreadをpthread_deatch()で呼び出して、それを切り離すことができます。

スレッドが切り離された後、システムによって解放されたリソースを持つために誰かが参加するのを待つ必要はありません。

私の質問は、スレッドBが作成された後に、結合可能なスレッド(スレッドBと呼ぶ)がスレッド(スレッドAと呼ぶことができます)によって結合された場合です。また、スレッドAが結合されたときにスレッドBが実行中であったと仮定し、スレッドBがその実行を終了するまでスレッドAを中断させる。一方、スレッドCはスレッドBでpthread_deatch()を呼び出しました。

このようなシナリオでは、スレッドBが終了するのを待っている状態のスレッドAはどうなりますか?スレッドBは実行を継続し、スレッドAは起動されてBの戻り値をフェッチしますか?またはスレッドBが切り離されているとすぐにスレッドAが起動されていますか?

答えて

2

POSIX description for pthread_join()は言う:

pthread_join()thread 引数で指定された値が合流可能なスレッドを参照していない場合の動作は未定義です。

あなたが別のスレッドで接合されているスレッド上pthread_deatch()を呼び出す場合、スレッドはもはや結合可能ではありませんので、pthread_join()の動作は不定となります。

つまり、これは許可されていません。

参加スレッドを「早く」起動する必要がある場合は、スレッドキャンセルを使用するか(pthread_join()はキャンセルポイント)、pthread_join()ではなく待機するための条件変数を設定します。

関連する問題