Вы действительно можете использовать условную переменную для этого. Это работает так, что ваше условие находится над некоторой общей переменной, которую устанавливает основной поток, чтобы указать, что рабочие потоки должны продолжаться. Вам требуется мьютекс, потому что у вас do есть общий ресурс - общая переменная, которую устанавливает основной поток и читают рабочие потоки.
Что-то вроде:
/* shared variables */
int run_iteration = -1;
pthread_mutex_t iteration_lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t iteration_cond = PTHREAD_COND_INITIALIZER;
Рабочие темы:
int current_iteration = 0;
while (... )
{
/* Wait for main to signal start of current_iteration */
pthread_mutex_lock(&iteration_lock);
while (run_iteration < current_iteration)
pthread_cond_wait(&iteration_cond, &iteration_lock);
pthread_mutex_unlock(&iteration_lock);
/* ... Execute current_iteration ... */
current_iteration++;
}
Основная нить:
/* signal start of next iteration */
pthread_mutex_lock(&iteration_lock);
run_iteration++;
pthread_cond_broadcast(&iteration_cond);
pthread_mutex_unlock(&iteration_lock);
В качестве альтернативы, если вам нужно, чтобы потоки работали в режиме блокировки, вместо этого можно использовать барьер pthread (pthread_barrier_t
).