2017-08-28 17 views
0

私のスタックにpthread_cond_waitを待っているコードがあります。シグナルは同じプロセスに送られますが、pthread_cond_waitを通知するシグナルハンドラには "pthread_cond_signal"コードはありませんが、それでもpthread_cond_waitは解放されます。待機を解除するために通常は "pthread_cond_wait"を行う他のスレッドがありますが、その時点ではアクティブではありません。pthread_cond_waitは完全に安全ですか?

答えて

1

pthread_cond_wait()は、で、いつでも通知されていなくても、で起きることができます。

これは「見せかけの起動」と呼ばれ、正しいコードは、これを処理しなければならない - ほとんどの場合、pthread_cond_wait()を呼び出すための正しい方法は次のように構造化ループ内にある:

condition_waiting_forが終わった状態である
while (!condition_waiting_for) 
    pthread_cond_wait(&cond, &mutex); 

スレッドが真になるのを待っているプログラムの共有状態です(たとえば、「ジョブキューは空ではありません」)。

このようにpthread_cond_wait()コールを構成すると、信号によって引き起こされる可能性のある起動を含む偽のウェークアップは、プログラムの正確さに影響しません。

0

pthread_cond_signalまたはpthread_cond_broadcastによって通知することができる。pthread_cond_wait

また、pthreadはpthread_cancelで取り消すことができます。これはスレッドに取り消し要求を送信します。スレッドのキャンセル要求を送信した後、戻りコードを調べて、スレッドが実際にキャンセルされたことを確認する必要があります。

how to kill a pthreadについて議論する良いスレッドがあります。

+0

私の質問は異なります。私はそれがユーザー定義のもののような他の信号から安全かどうかを尋ねています。 sem_waitが完全にシグナルセーフではないことを知っているので、チェックアウトhttps://linux.die.net/man/3/sem_wait - >シグナルハンドラは、使用に関係なく、これらの関数の1つにブロックされた呼び出しを常に中断しますsigaction(2)のSA_RESTARTフラグ – aTJ

関連する問題