Ответ 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
}
}