posixスレッドを使用して、Cで固定数のスレッドを持つプログラムに取り組んでいます。
エラーが原因でスレッドが終了したときに通知を受け取るにはどうすればよいですか?
それを検出する信号はありますか?
もしそうなら、シグナルハンドラーはスレッド数を同じに保つために新しいスレッドを作成できますか?
posixスレッドを使用して、Cで固定数のスレッドを持つプログラムに取り組んでいます。
エラーが原因でスレッドが終了したときに通知を受け取るにはどうすればよいですか?
それを検出する信号はありますか?
もしそうなら、シグナルハンドラーはスレッド数を同じに保つために新しいスレッドを作成できますか?
そうすれば、問題は発生しません。
おそらく、USR1シグナルをメインスレッドに送信して、物事が洋ナシ型になったことを知らせます(私はおっぱいを上げるつもりでした!)
なんらかの理由で、Ed Heal の「正しく動作する」アプローチ (OP の質問に対する私のお気に入りの回答です) を使用できなかった場合、怠惰なキツネはpthread_cleanup_push()
とpthread_cleanup_pop()
マクロを見て、全体を含めることを考えるかもしれません。そのような 2 つのマクロの間にスレッド関数の本体。
あなたが提供した最新の入力を使用して、特定のプロセスが開始したスレッドの数を取得するために、次のようなことを行うことをお勧めします-
#include<stdio.h>
#define THRESHOLD 50
int main ()
{
unsigned count = 0;
FILE *a;
a = popen ("ps H `ps -A | grep a.out | awk '{print $1}'` | wc -l", "r");
if (a == NULL)
printf ("Error in executing command\n");
fscanf(a, "%d", &count );
if (count < THRESHOLD)
{
printf("Number of threads = %d\n", count-1);
// count - 1 in order to eliminate header.
// count - 2 if you don't want to include the main thread
/* Take action. May be start a new thread etc */
}
return 0;
}
注:
ps H
すべてのスレッドを表示します。
$1
私のシステムUbuntuでPIDが表示される最初の列を出力します。カラム番号はシステムによって変わる場合があります
a.out
プロセス名に置き換えてください
バッククォートはその中の式を評価し、プロセスの PID を提供します。すべての POSIX スレッドが同じ PID を持つという事実を利用しています。
何らかの理由でスレッドが停止または終了したときに、Linux が通知することはないと思います。ただし、手動で行うことができます。
まず、スレッドが終了する 2 つの方法を考えてみましょう。
最初の方法では、スレッド自体が誰か (スレッド マネージャーなど) に、自分が終了していることを伝えることができます。その後、スレッド マネージャは別のスレッドを生成します。
2 番目の方法では、ウォッチドッグ スレッドは、スレッドが有効かどうかを追跡できます。これは多かれ少なかれ次のように行われます。
Thread:
while (do stuff)
this_thread->is_alive = true
work
Watchdog:
for all threads t
t->timeout = 0
while (true)
for all threads t
if t->is_alive
t->timeout = 0
t->is_alive = false
else
++t->timeout
if t->timeout > THRESHOLD
Thread has died! Tell the thread manager to respawn it
関数ポインターを中間関数に渡して、スレッドを作成します。その中間関数を非同期的に開始し、渡された関数を同期的に呼び出すようにします。関数が例外を返したりスローしたりすると、好きな方法で結果を処理できます。