1

pthread を使用する C プログラムがあります。

新しく作成されたスレッドを作成したらすぐに実行したいと思います。

この背後にある理由は、私のスレッドにはシグナル ハンドラーを設定するための初期化コードがあり、メイン スレッドがいくつかのシグナルを送信する前に、ハンドラーの準備が整っていることを確認する必要があるためです。

pthread_yieldの直後にやってみましpthread_createたが、成功しませんでした。

違いがあるとは思えませんが、x86_64 で Linux 3.6 を実行しています。

ありがとう

4

2 に答える 2

6

続行する前にすべてのスレッドが同じポイントに到達するまでメインスレッドを待機させることが目標である場合は、次を使用することをお勧めしpthread_barrier_waitます。

void worker(void*);

int main(int argc, char **argv)
{
    pthread_barrier_t b;
    pthread_t children[TCOUNT];
    int child;

    /* +1 for our main thread */
    pthread_barrier_init(&b, NULL, TCOUNT+1);

    for (child = 0; child < TCOUNT; ++child)
    {
        pthread_create(&children[child], NULL, worker, &b);
    }

    printf("main: children created\n");

    /* everybody who calls barrier_wait will wait 
     * until TCOUNT+1 have called it
     */
    pthread_barrier_wait(&b);

    printf("main: children finished\n");

    /* wait for children to finish */
    for (child = 0; child < TCOUNT; ++child)
    {
        pthread_join(&children[child], NULL);
    }

    /* clean-up */
    pthread_barrier_destroy(&b);

    return 0;
}

void worker(void *_b)
{
    pthread_barrier_t *b = (pthread_barrier_t*)_b;
    printf("child: before\n");
    pthread_barrier_wait(b);
    printf("child: after\n");
}
于 2012-09-21T19:35:29.853 に答える
5

または、バリアを使用することもできます。つまり、pthread_barrier_waitを呼び出して (各スレッドのルーチンの早い段階で、またはメインスレッドの初期化時に)、関連するすべてのスレッドがバリアに到達したことを確認します (その後、一部のスレッドがいたずらなシグナルを実行する可能性があります)。トリック)。この質問を参照してください。

于 2012-09-21T19:32:30.767 に答える