マルチスレッドのプログラミング

条件変数上で割り込まれた待機

マスクされていない捕獲されたシグナルが条件変数上で待機しているスレッドに配信された場合、シグナルハンドラから復帰すると、スレッドは誤った呼び起こしによって条件待ち関数から復帰します。 pthread_cond_wait() および pthread_cond_timedwait() は、pthread_cond_signal() または pthread_cond_broadcast() の呼び出しが別のスレッドによって実行されなかった場合でも 0 を返します。この場合、sigaction() へのフラグとして SA_RESTART が指定されたかどうかは無視されます。pthread_cond_wait() および pthread_cond_timedwait() 関数は、自動的には再起動されません。いずれの場合も、条件待ちから復帰する前に、関連付けられている相互排他ロックを再度獲得します。

関連付けられている相互排他ロックを再度獲得しても、スレッドがシグナルハンドラを実行しているときに相互排他ロックを獲得しているという意味ではありません。シグナルハンドラ内では、相互排他ロックの状態は不定です。