Подтвердить что ты не робот

Функция синхронизации pthread

Есть ли функция в библиотеке pthread для синхронизации потоков? Не мьютексы, а не семафоры, только одна функция вызова. Предполагается заблокировать потоки, которые попадают в эту точку, пока все нити не достигнут такой функции. Например:

function thread_worker(){
    //hard working

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

Итак, printf вызывается только тогда, когда все потоки завершают работу.

4b9b3361

Ответ 1

Правильный способ сделать это будет с барьером. 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
    }
}