2017-06-09 13 views
2

些細な質問があれば申し訳ありませんが、解決策をオンラインで見つけることができませんでした。少数のプロセスを持つ小さなプログラムがあり、各プロセスにはいくつかのスレッドが含まれています。親スレッドから子スレッドを削除する方法 - C

親プロセスが特定のメッセージを受け取ると、すべてのサブスレッドを強制終了し、すべてのmutexを破棄することになっています。問題は、これらのスレッドの一部が(I/Oコマンドで)ブロックされ、そのためにプロシージャを終了するために何らかの信号またはmsgを受け取ることができないことです。

私はpthread_cancelを使用して考えたとcancel routineをオーバーライドしますが、問題はcancel signalが送信されるので、破壊することができないとき、いくつかのミューテックスをロックしているように見えたということです。
pthread_killを使用すると、プロセス全体が終了するため、クリーンな終了が必要なときには使用できないため、機能しませんでした。

プロセスはどのようにして子スレッドを強制終了し、クリーンな方法でミューテックスを破棄できますか?

コードの関連セクションのようなものとして見えます:

ret = fork() 
if(ret > 0) 
{ 
    pthread_t th1, th2; 
    my_pthread_create(&th1,threadFunction1,NULL); 
    my_pthread_create(&th2,threadFunction2,NULL); 
    if(msgrcv(qid1,&msg,MSG_SIZE,0,0) < 0) 
     perror("msgrcv failed...\n"); 
    else 
     //print some information from the global variables, terminate 
     //threads and destroy mutexes 
} 
else if(ret<0) 
    perror("fork failed...\n"); 
else 
    .... 

すべてのヘルプは本当に理解されるであろう!

+1

[この質問](https://stackoverflow.com/questions/14268080/cancelling-a-thread-that-has-a-mutex-locked-does-not-unlock-the-mutex)はC++用です、それとその受け入れられた答えは役に立つと思う。 –

+0

"*どのようにプロセスが子スレッドをクリーンな方法で削除することができますか?"スレッドのキャンセルはちょうど "ダーティ"なので、これは定義上可能ではありません。これを行わないと、予期しない副作用が発生する可能性があります。きれいな方法は、親スレッドによって設定され、子によって読み込まれるフラグを使用することです。フラグが設定されている場合、子どもたちは自分自身を終了します。もしスレッドがシステムコールの中で待っているのであれば、そのスレッドはシステムコールを中断するシグナルを送ります。 – alk

答えて

2

scoped_lock

は、プログラムの実行がスコープの外に出たときに自動的にミューテックスを解放するだろうあなたが行くことができる最良の選択肢の一つです、ありがとうございました。

これは本当に必要な場合を除いて、実稼動準備が整ったコードでスレッドを強制終了することはお勧めしません。他のオプションはありませんが、シグナルメカニズムを使用してスレッド自体に死ぬよう通知することもできます多くの問題を避ける。たとえば、特定のシグナルのスレッド内に待機機能を持たせ、同じシグナルを受信するとすぐにスレッドを終了することができます。

関連する問題