マスター スレッドといくつかのワーカー スレッドを使用してプログラムを作成しており、シグナル処理を正しく行いたいと考えています。私の問題は次のとおりです。
マスタースレッドが開始し、すべての割り当てを行います
マスター スレッドが SIGINT シグナル ハンドラを設定する
マスター スレッドはワーカー スレッドを開始します。ワーカー スレッドは特別なクリーンアップを必要としませんが、システム コールまたはセマフォでスリープ状態になる可能性があります。
SIGINT が受信されると、それを受信するスレッドは 1 つだけであると理解しています。そのため、スレッドがシステム コールまたはセマフォでスリープしている場合、それらは起動されず、ワーカー スレッドに pthread_join できず、マスター スレッドで必要なすべてのクリーンアップを実行できません。
次のシグナル ハンドラーで問題を解決できますか?
void term(int sig)
{
g_do_cleanup = 1;
pthread_kill(worker_1_id, some_other_signal);
...
pthread_kill(worker_2_id, some_other_signal);
}
私が期待しているのは、SIGINT を受信すると、すべてのスレッドが別のシグナルで通知され、ブロッキング呼び出しから抜け出し、g_do_cleanup
フラグを確認して正常に終了することです。
これを適切に行う方法についてのコメントやリンクは大歓迎です。
編集:特定の条件で待機している複数のスレッドをウェイクアップする方法を探しているわけではないので、 pthread_cond_signal アプローチが探しているものではないと思います。私が欲しいのは:
- ブロッキング呼び出しでブロックされたすべてのスレッドがこれらの呼び出しから戻る方法を見つけます。
- または、メインのスレッドを除くすべてのスレッドを強制終了します。