0

私はC++プログラムを持っていて、その中でpthreadを使用しています。このプログラムでは、スレッドを使用してデータ内のパターンを検索します。これが私のプログラムでのやり方です:

for (i=0; i<NUM_THREADS; i++) {
    rc = pthread_join(threads[i], NULL);
    assert(0==rc);
    if (args[i].islast == true || args[i].nextaddr != NULL){ //if the pattern is found
        for (j = i+1; j<NUM_THREADS;j++){
            rc = pthread_join(threads[j], NULL); //join the other threads that is not useful
            assert(0 == rc);
        }
        return args[i].nextaddr; //return the address obtained in the thread of interest
    }
}

しかし、for役に立たないスレッドを結合するためのこの2番目のループはコストがかかります(プログラムは非常に高速である必要があり、単純な「for」を回避できれば、それは素晴らしい成果です)。

すべての子スレッドを一度に強制終了できるコマンドが存在するかどうかを知りたいです。

追伸:役に立たないスレッドに「参加」する必要があります。これを行わないと、そのスレッドをリサイクルできず、しばらくするとスレッドの制限に達します。

4

1 に答える 1

0

さまざまなスレッドを結合するために for ループを使用する代わりに、バリアを使用できます。

pthread_barrier_t barrier; // the barrier object
pthread_t threads [NUM_THREADS]; // the thread childs.

// create the threads ...

// initialize the barrier like other pthread object.
pthread_barrier_init (&barrier, NULL, NUM_THREADS+1);

2 番目のパラメーターはバリアの属性であることに注意してください。NULL の場合、デフォルトの属性が設定されます。3 番目の引数は、バリアによって同期されるスレッドの数です。各スレッドは pthread_barrier_wait を呼び出して、同じ関数を呼び出す他のスレッドを待機します。特定の数のスレッドがバリアで待機している場合、すべてのスレッドのブロックが解除されます。

NUM_THREADS+1 と書きましたが、NUM_THREADS は子スレッドの数で、それをインクリメントしてメインスレッドもカウントします。

「重要なスレッド」では、子スレッドを待つためにこのようなものを書くことができます。

/* do important stuff while child threads are executing ... */

/* wait for the childs (join) */
pthread_barrier_wait (&barrier); // main thread gets blocked by the barrier.
                               // untill a specific number of threads reaches the
                               // barrier as well

/* continue execution ... */

子スレッドで、次のコード行を追加します ...

void* child_thread_func (void* args)
{
    /* do something with the thread ... */

    /* syncronize with the barrier and exit */
    pthread_barrier_wait (&barrier);

    pthread_exit (some_data);
}

このようにして、子のブロックが解除されると、すぐに戻ってメイン スレッドに参加します。

バリアに関連付けられているリソースを解放することを忘れないでください。(スレッドがバリアを使用しなくなった場合のみ) ...

pthread_barrier_destroy (&barrier);
于 2013-02-21T16:36:38.810 に答える