6

posixスレッドを使用して、Cで固定数のスレッドを持つプログラムに取り組んでいます。

エラーが原因でスレッドが終了したときに通知を受け取るにはどうすればよいですか?

それを検出する信号はありますか?

もしそうなら、シグナルハンドラーはスレッド数を同じに保つために新しいスレッドを作成できますか?

4

6 に答える 6

1
  1. スレッドを切り離します
  2. エラーを適切に処理できるようにします。つまり、ミューテックス、ファイルなどを閉じます。

そうすれば、問題は発生しません。

おそらく、USR1シグナルをメインスレッドに送信して、物事が洋ナシ型になったことを知らせます(私はおっぱいを上げるつもりでした!)

于 2012-05-04T09:28:11.307 に答える
1

なんらかの理由で、Ed Heal の「正しく動作する」アプローチ (OP の質問に対する私のお気に入りの回答です) を使用できなかった場合、怠惰なキツネはpthread_cleanup_push()pthread_cleanup_pop()マクロを見て、全体を含めることを考えるかもしれません。そのような 2 つのマクロの間にスレッド関数の本体。

于 2012-05-04T15:10:11.987 に答える
1

あなたが提供した最新の入力を使用して、特定のプロセスが開始したスレッドの数を取得するために、次のようなことを行うことをお勧めします-

#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 を持つという事実を利用しています。

于 2012-05-04T10:53:54.657 に答える
1

何らかの理由でスレッドが停止または終了したときに、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
于 2012-05-04T11:40:19.343 に答える
1

関数ポインターを中間関数に渡して、スレッドを作成します。その中間関数を非同期的に開始し、渡された関数を同期的に呼び出すようにします。関数が例外を返したりスローしたりすると、好きな方法で結果を処理できます。

于 2012-05-04T09:41:17.580 に答える