些細な質問があれば申し訳ありませんが、解決策をオンラインで見つけることができませんでした。少数のプロセスを持つ小さなプログラムがあり、各プロセスにはいくつかのスレッドが含まれています。親スレッドから子スレッドを削除する方法 - 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
....
すべてのヘルプは本当に理解されるであろう!
は
[この質問](https://stackoverflow.com/questions/14268080/cancelling-a-thread-that-has-a-mutex-locked-does-not-unlock-the-mutex)はC++用です、それとその受け入れられた答えは役に立つと思う。 –
"*どのようにプロセスが子スレッドをクリーンな方法で削除することができますか?"スレッドのキャンセルはちょうど "ダーティ"なので、これは定義上可能ではありません。これを行わないと、予期しない副作用が発生する可能性があります。きれいな方法は、親スレッドによって設定され、子によって読み込まれるフラグを使用することです。フラグが設定されている場合、子どもたちは自分自身を終了します。もしスレッドがシステムコールの中で待っているのであれば、そのスレッドはシステムコールを中断するシグナルを送ります。 – alk