2016-05-10 5 views
1

こんにちは私はこの問題に固執しており、そのための最良の解決法はどれか分かりません:適切なマルチスレッドプログラム終了。 C

私はいくつかのスレッドでプロセスを持っています。すべてのスレッドには信号がマスクされ、保留信号があるかどうかをチェックするのはただ1つ(SignalHandler)になります。

while(!shouldEnd){ 
     if(!sigwait(&set, &signum)){ 
      if(signum == SIGINT){ 
       fprintf(stderr, "Ricevuto SIGINT\n"); 
      } 
      else{ 
       //TODO 
      } 
     } 
    } 

今私はそれが(例えば)SIGINTを受け取ったときにも、他のスレッドを終了したいと思います。私はそれをどうやって正しく行うことができますか?主な問題は、他のスレッドが条件変数を待っているか、またはaccept()(ソケット接続用)で待機している可能性があることです。私は良いことが "shouldEnd"のような変数を入れて、スレッドが動作を停止する必要があります1に設定すると思います。それは良いアイデアですか?待っているのはどう?ほとんどの場合、ソケット接続を待っていますか?

答えて

1

まず、スレッドに何を使用しているのかわかりません。あなたはそれがとにかくRAII style locks and whatnot.

であなたの人生が楽になりますように、このためにlibBoostを使用して検討するかもしれない、あなたのプロセスの唯一選出されたスレッド(通常main()、ほとんどの例では)、the signal, unless you've enabled signal maskingをキャッチします。

  1. ウェイクアップスレッドがaccept()by modifying your FD set to include a pipe that can also wake up the blocking callに待っている:あなたは、スレッドが正常にシャットダウンしたいときに、あなただけが必要です。
  2. 他のスレッドが待機しているコンディションを通知し、mutexで保護されたブール値/フラグを設定して、早期に終了する必要があることをスレッドに通知します(例:mutexLock()l; bool bExitEarly = true; signal(condVar); mutexUnlock();)。
  3. Assuming you spawned the threads as joinable (ie: non-detached)の場合は、各スレッドオブジェクトへのポインタのコピーがあることを確認し、停止するように通知した後でそれぞれにthread_join()を呼び出してください。これにより、スレッドが完全に停止してからmain()が終了するようになります。これをしないと、スレッドが完了する前にmain()が終了し、スレッドがシャットダウンロジックの途中で強制的に強制終了されるだけで、プログラムがクラッシュしたり悪化したりする可能性があります。
+0

私はpthreadsを使用しています。 1)ありがとうと思います。 2)現在、条件変数を待っているすべてのスレッドにbroadcast()する必要がありますか? 3)既にそれを行いました。それを指摘してくれてありがとう。 – Levenlol

+0

@Levenlol **(1)** Good。いくつかのスレッドで使用されている場合は、ラッパーを作成することを検討する必要があります。それはあなたの頭の中で多くの頭痛を軽減します。 **(2)**はい。あなたが同じcondvarで待っている複数のスレッドを持っていない限り、シグナルはうまくいくはずです。それは事実ですか?もしそうなら、ブロードキャストが起こったときに待機していなかった場合(潜在的なデッドロック)に備えて、どのスレッドがブロードキャストを受信したかを追跡するために、各スレッドのための何らかの種類の 'bIsThreadAwake'フラグが必要です。 **(3)**良い仕事。あなたは宿題をしたようです。これが役立つ場合は、「Accepted」とマークしてください。 TY。 – DevNull

+0

2)スレッドが起きていて、ブロードキャストを受信して​​いない場合は、私は次のようにしています:suspend(cvar、mtx)待ちの前にpthread_exitの場合に終了する必要があるかどうかのスレッドチェック。良い解決策になりますか? – Levenlol

関連する問題