web-dev-qa-db-ja.com

すべての子スレッドが終了するまでメインスレッドを待機させる方法は?

メインスレッドで2つのスレッドを起動するつもりです。メインスレッドは、2つの子スレッドがすべて終了するまで待機する必要があります。これが私の方法です。

void *routine(void *arg)
{
    sleep(3);
}

int main()
{
    for (int i = 0; i < 2; i++) {
        pthread_t tid;
        pthread_create(&tid, NULL, routine, NULL);
        pthread_join(&tid, NULL);  //This function will block main thread, right?
    }
}

上記のコードでは、pthread_joinはメインスレッドに子スレッドを待機させますが、問題は、最初のスレッドが終了するまで2番目のスレッドが作成されないことです。これは私が望むものではありません。

私が望むのは、2つのスレッドがメインスレッドで即座に作成され、メインスレッドが終了するまで待機することです。のように思える pthread_joinトリックをすることはできません、できますか?

多分semaphoreを介して、私は仕事をすることができると思いましたが、他の方法はありますか?

33
Alcott
int main()
{
    pthread_t tid[2];
    for (int i = 0; i < 2; i++) {
        pthread_create(&tid[i], NULL, routine, NULL);
    }
    for (int i = 0; i < 2; i++)
       pthread_join(tid[i], NULL);
    return 0;
}
58
perreal

最初にすべてのスレッドを作成してから、それらすべてを結合します。

pthread_t tid[2];

/// create all threads
for (int i = 0; i < 2; i++) {
    pthread_create(&tid[i], NULL, routine, NULL);
}

/// wait all threads by joining them
for (int i = 0; i < 2; i++) {
    pthread_join(tid[i], NULL);  
}

または、pthread_attr_t変数を用意し、 pthread_attr_init(3) を使用してから pthread_attr_setdetachedstate(3) を使用し、そのアドレスを pthread_create(3 ) 2番目の引数。 Thosはdetached状態でスレッドを作成します。または Jxhの答え で説明されているようにpthread_detachを使用します。

10

スレッドを切り離して開始することができ、参加する心配はありません。

for (int i = 0; i < 2; i++) {
    pthread_t tid;
    pthread_create(&tid, NULL, routine, NULL);
    pthread_detach(tid);
}
pthread_exit(0);

または、別の方法として、死んだスレッドがメインスレッドに報告して、スレッドを作成した順序ではなく、終了した順序で結合することもできます。

void *routine(void *arg)
{
    int *fds = (int *)arg;
    pthread_t t = pthread_self();
    usleep((Rand()/(1.0 + Rand_MAX)) * 1000000);
    write(fds[1], &t, sizeof(t));
}

int main()
{
    int fds[2];
    srand(time(0));
    pipe(fds);
    for (int i = 0; i < 2; i++) {
        pthread_t tid;
        pthread_create(&tid, NULL, routine, fds);
        printf("created: %llu\n", (unsigned long long)tid);
    }
    for (int i = 0; i < 2; i++) {
        pthread_t tid;
        read(fds[0], &tid, sizeof(tid));
        printf("joining: %llu\n", (unsigned long long)tid);
        pthread_join(tid, 0);
    }
    pthread_exit(0);
}
4
jxh