こんにちは私はこの問題に固執しており、そのための最良の解決法はどれか分かりません:適切なマルチスレッドプログラム終了。 C
私はいくつかのスレッドでプロセスを持っています。すべてのスレッドには信号がマスクされ、保留信号があるかどうかをチェックするのはただ1つ(SignalHandler)になります。
while(!shouldEnd){
if(!sigwait(&set, &signum)){
if(signum == SIGINT){
fprintf(stderr, "Ricevuto SIGINT\n");
}
else{
//TODO
}
}
}
今私はそれが(例えば)SIGINTを受け取ったときにも、他のスレッドを終了したいと思います。私はそれをどうやって正しく行うことができますか?主な問題は、他のスレッドが条件変数を待っているか、またはaccept()(ソケット接続用)で待機している可能性があることです。私は良いことが "shouldEnd"のような変数を入れて、スレッドが動作を停止する必要があります1に設定すると思います。それは良いアイデアですか?待っているのはどう?ほとんどの場合、ソケット接続を待っていますか?
私はpthreadsを使用しています。 1)ありがとうと思います。 2)現在、条件変数を待っているすべてのスレッドにbroadcast()する必要がありますか? 3)既にそれを行いました。それを指摘してくれてありがとう。 – Levenlol
@Levenlol **(1)** Good。いくつかのスレッドで使用されている場合は、ラッパーを作成することを検討する必要があります。それはあなたの頭の中で多くの頭痛を軽減します。 **(2)**はい。あなたが同じcondvarで待っている複数のスレッドを持っていない限り、シグナルはうまくいくはずです。それは事実ですか?もしそうなら、ブロードキャストが起こったときに待機していなかった場合(潜在的なデッドロック)に備えて、どのスレッドがブロードキャストを受信したかを追跡するために、各スレッドのための何らかの種類の 'bIsThreadAwake'フラグが必要です。 **(3)**良い仕事。あなたは宿題をしたようです。これが役立つ場合は、「Accepted」とマークしてください。 TY。 – DevNull
2)スレッドが起きていて、ブロードキャストを受信していない場合は、私は次のようにしています:suspend(cvar、mtx)待ちの前にpthread_exitの場合に終了する必要があるかどうかのスレッドチェック。良い解決策になりますか? – Levenlol