pthread条件変数を待っていますが、SIGUSR1(またはその他の信号)を受け取ったときにpthread_cond_signalや偽のウェイクアップが原因でシグナルが待っているのを待って停止するのを検出しません。これどうやってするの?pthread条件変数またはシグナルを待つ方法はありますか?
答えて
pthreadsプログラムで信号を処理する信頼できる方法は、すべてのスレッドで処理したいすべてのシグナルをマスクし、sigwaitinfo()
(またはsigtimedwait()
)を呼び出してループする専用シグナル処理スレッドを作成することです。
信号処理スレッドは通常のミューテックス保護された共有変数とpthread_cond_signal()
/pthread_cond_broadcast()
ウェークアップを使用して、受け取った信号について他のスレッドに知らせることができます。
あなたの例では、専用信号処理スレッドは、SIGUSR1
が受信されたことを示す(mutex保護された)フラグを設定して、スレッドが待機している条件変数を通知できます。待ちスレッドは、ループ内の他の共有状態に加えて、信号フラグを確認する必要があります。ループはpthread_cond_wait()
です。
スレッドは、プログラム内の任意の条件変数で待機している可能性があります。そのため、スレッドがシグナルハンドラから待っている条件変数に信号を送るだけではありません。私はpthread_cond_waitの周りのラッパー関数を使用してシグナルハンドラーのスレッドローカルに条件を保存することができましたが、これは競合状態から保護するのは難しいです。シグナルが到着し、ハンドラはローカルスレッドを格納してから待機を開始するまでの間にpthread_cond_broadcastを実行します。 – tbodt
@tbodt:POSIXは['pthread_cond_signal()'はシグナルハンドラでは安全ではないと言っています](http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_cond_signal.html)。 –
あなたのスレッドが待っている状態変数は、常に明らかになっているはずです。いくつかの可能性がある場合、それらをすべて伝えることができます(条件変数は、とにかく覚醒する可能性があるため、不要な信号を送ることは常に安全です)。 (また、ここでの考え方は、シグナルハンドラから 'pthread_cond_broadcast()'を呼び出すのではなく、 'sigwaitinfo()'が返ってシグナルをデキューした後に、通常のスレッドコンテキストで実行されているシグナルハンドリングスレッドからです)。 – caf
- 1. C - のpthread条件変数
- 2. pthread条件変数とのスレッド同期
- 3. Pthread条件変数とデッドロックなし
- 4. 条件にNSXMLParserを壊す方法はありますか?
- 5. MySQLが条件を満たす行が挿入されるのを待つ方法がありますか?
- 6. Javascriptで関数を条件とインターレースする方法はありますか?
- 7. 条件変数を使用してpthreadを実行する最善の方法
- 8. pthreadシグナルを別のものにして実行を続ける方法はありますか?
- 9. msbuild-extension(またはregex)の条件はありますか?
- 10. チャンネルまたはsync.Condを使用して条件を待つ
- 11. 複数の「またはさんとの条件を連結する方法はありますか?
- 12. 構造内のpthread条件待ちを使用する
- 13. どのスレッドが条件変数を待たずに何かを作る方法
- 14. Djangoシグナルを表示する方法はありますか?
- 15. クラスの初期化を待つ方法はありますか?
- 16. Windows Phone 8でIAsyncResultを待つ方法はありますか?
- 17. vaadinのメッセージボックスでオプションを待つ方法はありますか?
- 18. redux-sagasでアクションを待つ方法はありますか?
- 19. Reactでは、条件文に動的変数名を付ける方法はありますか?
- 20. パンダには2つの条件がありますか?
- 21. 角1:複数の条件を含む複数の条件または他の条件が真である場合に条件を除外する方法
- 22. C - pthread関数の再利用 - ローカル変数と競合条件
- 23. Casperjs - n秒待つ方法はありますか?
- 24. バッチスクリプトで複数の条件を持つファイルをループする方法はありますか?
- 25. MongoDBで複数の条件を持つ配列内のオブジェクトをクエリする方法はありますか?
- 26. IFまたは条件農産物「整数表現期待」
- 27. スクリプト内で一時停止または待つ方法がありますか?
- 28. sqlの複数の条件はありますか?
- 29. _WinAPI_EnumDisplayDevices()に対する条件文:より良い方法はありますか?
- 30. XAMLのバインディングで変数の値と条件を使用する方法はありますか?
@alk pthread_cond_waitとpthread_cond_timedwaitのmanページには、「これらの関数は[EINTR]のエラーコードを返さないものとします。 – tbodt
ヘルパースレッドを使用する必要があるようです(シグナルをキャッチするか、条件変数を待つために)。実際には、すべてのレースを終了するには、2つのヘルパースレッドとセマフォを使用しなければならず、元のスレッドがセマフォを待機している必要があります。 –