Как писал Андерс, условное ожидание - это решение. В POSIX Thread API вы используете pthread_cond_wait вместе с мьютексом. Это довольно просто, работает следующий шаблон:
int ready_flag = 0;
pthread_mutex_t ready_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t ready_cond = PTHREAD_COND_INITIALIZER;
void wait_ready()
{
pthread_mutex_lock(&ready_mutex);
while(!ready_flag) {
pthread_cond_wait(&ready_cond, &ready_mutex);
}
pthread_mutex_unlock(&ready_mutex);
}
void set_ready(int ready)
{
pthread_mutex_lock(&ready_mutex);
ready_flag = ready;
pthread_cond_signal(&ready_cond);
// or using pthread_cond_broadcast(&ready_cond);
pthread_mutex_unlock(&ready_mutex);
}
Разница между pthread_cond_signal и pthread_cond_broadcast заключается в том, что если более одного потока ожидает установки флага, pthread_cond_signal освобождает только один поток, но широковещательная передача освобождает все потоки.
Не то чтобы цикл while, созданный вокруг вашего условия, зависел от вас, вы можете протестировать несколько условий или делать все, что захотите. Шаблон кода гарантирует, что ваши тесты выполняются на защищенных переменных, так что условия гонки никогда не могут вызвать проблем, например
while(resource_a_busy && resource_b_busy) ...
Типичная проблема, когда оба состояния ресурса должны быть защищены мьютексом.
cond_wait может быть удален из цикла, но тогда он переведет wait_ready в цикл опроса, который потребляет процессор, pthread_wait_cond не потребляет никакой процессор.
Существуют библиотеки портирования, которые предоставляют Win32-подобный API поверх pthreads, а также библиотеки, которые предоставляют phread-подобный API поверх Win32 API событий, последний называется Pthreads-w32