プロセスの特定のスレッドを終了する方法は?

プロセスの特定のスレッドを終了する方法は?
$ ps -e -T | grep myp | grep -v grep
  797   797 ?        00:00:00 myp
  797   798 ?        00:00:00 myp
  797   799 ?        00:00:00 myp
  797   800 ?        00:00:00 myp

これは、PID = 797のプロセスmypと異なるSPIDを持つ4つのスレッドを示しています。

プロセス全体を終了せずにプロセス内の特定のスレッドを終了する方法場合によっては、特定のスレッドに致命的な依存関係がある場合、これはまったく不可能になる可能性があることがわかります。しかし、とにかく可能ですか?うん、どうですか?

試しましたが、kill 799プロセス自体が終了しました。これでmyp、プロセスなしで失敗する依存関係があるのか800​​、それとも殺すのが些細なので、単一のプロセスを殺すことができないからかどうかはわかりません。

答え1

スレッドはプロセスの不可欠な部分であり、プロセスの外部で終了することはできません。一部はpthread_kill関数ですが、スレッド自体のコンテキスト内でのみ機能します。リンクのドキュメントから:

pthread_kill() は、与えられたスレッドのコンテキスト内でのみ信号が処理されるようにします。シグナルアクション(終了または停止)はプロセス全体に影響します。

答え2

この質問に対する一般的な答えは、プロセスの協力によって提供されるメカニズムが何であるかです。これはプロセスの協力なしには不可能です。プロセスがスレッドで構成されることは、プロセス内部の詳細、すなわち意図的に設計され、プロセスの外部に露出されない部分である。

答え3

あなたは見つけることができますtgkill()効果があるマニュアルページで述べたように、Linuxに固有のものです。

tgkill() は、スレッドグループ tgid にあるスレッド ID tid を持つスレッドにシグナル sig を送信します。 (逆に、kill(2)はプロセス全体(つまりスレッドグループ)にシグナルを送信するためにのみ使用でき、シグナルはプロセス内のすべてのスレッドに渡されます。)

答え4

@ gkvの答えに加えて、その一部でpthread_cancel(3)ある関数を見ることもできます<pthread.h>。マニュアルページから:

pthread_cancel() 関数はスレッドにキャンセル要求を送信します。ターゲットスレッドがキャンセル要求に応答するかどうかとタイミングは、そのスレッドが制御する2つの属性、つまりキャンセル可能性の状態と種類によって異なります。

関連情報