Вы можете использовать барьеры.
Из раздела Барьеры pthread руководства по pthread от randu.org :
pthreads может участвовать в барьере для синхронизации с некоторым моментом времени. Барьерные объекты инициализируются как взаимные исключения или условные переменные, за исключением одного дополнительного параметра count. Переменная count определяет число потоков, которые должны присоединиться к барьеру, чтобы барьер достиг завершения и разблокировать все потоки, ожидающие на барьере.
Другими словами, вы можете создать барьер с помощью n
, и все потоки, которые вызывают pthread_barrier_wait
, будут ждать, пока не будут сделаны n
вызовы pthread_barrier_wait
.
Ниже приведен простой пример, в котором все три потока будут печатать «До», прежде чем любые потоки будут печатать «После».
#include <pthread.h>
#include <stdio.h>
pthread_barrier_t barrier;
void* foo(void* msg) {
printf("%s: before\n", (char*)msg);
// No thread will move on until all three threads have reached this point
pthread_barrier_wait(&barrier);
printf("%s: after\n", (char*)msg);
}
int main() {
// Declare three threads
int count = 3;
pthread_t person_A, person_B, elevator;
// Create a barrier that waits for three threads
pthread_barrier_init(&barrier, NULL, count);
// Create three threads
pthread_create(&person_A, NULL, foo, "personA");
pthread_create(&person_B, NULL, foo, "personB");
pthread_create(&elevator, NULL, foo, "elevator");
pthread_join(person_A, NULL);
pthread_join(person_B, NULL);
pthread_join(elevator, NULL);
printf("end\n");
}
Запустите код здесь