13

pthread ライブラリにスレッドを同期する関数はありますか? ミューテックスでもセマフォでもなく、呼び出し関数は 1 つだけです。すべてのスレッドがそのような関数に到達するまで、その時点に到達するスレッドをロックすることになっています。例えば:

function thread_worker(){
    //hard working

    syncThreads();
    printf("all threads are sync\n");
}

そのため、すべてのスレッドがハードワークを終了したときにのみ、printf が呼び出されます。

4

1 に答える 1

19

これを行う適切な方法は、バリアを使用することです。pthreadを使用してバリアをサポートしpthread_barrier_tます。同期する必要のあるスレッドの数で初期化し、次にpthread_barrier_waitそれらのスレッドを同期させるために使用します。

例:

pthread_barrier_t barr;

void thread_worker() {
    // do work
    // now make all the threads sync up
    int res = pthread_barrier_wait(&barr);
    if(res == PTHREAD_BARRIER_SERIAL_THREAD) {
        // this is the unique "serial thread"; you can e.g. combine some results here
    } else if(res != 0) {
        // error occurred
    } else {
        // non-serial thread released
    }
}


int main() {
    int nthreads = 5;
    pthread_barrier_init(&barr, NULL, nthreads);

    int i;
    for(i=0; i<nthreads; i++) {
        // create threads
    }
}
于 2012-10-16T04:29:28.973 に答える