Вообще говоря, pthread_cond_wait()
и pthread_cond_signal()
называются ниже:
//thread 1:
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
do_something()
pthread_mutex_unlock(&mutex);
//thread 2:
pthread_mutex_lock(&mutex);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
Этапы
-
pthread_cond_wait(&cond, &mutex);
, он разблокирует мьютекс -
Тема 2 блокирует мьютексы и вызывает
pthread_cond_signal()
, который открывает мьютексы -
В потоке 1 вызывается
pthread_cond_wait()
и снова блокируется мьютекс
Теперь в потоке 2, после вызова pthread_cond_signal()
, будет запущен pthread_mutex_unlock(&mutex)
, мне кажется, что он хочет разблокировать мьютекс, который теперь заблокирован потоком 1. Есть ли что-то не так в моем понимании
Кроме того, мне кажется, что pthread_cond_wait()
может быть вызван только одним потоком для той же пары cond-mutex. Но есть высказывание "Функция pthread_cond_signal() должна разблокировать хотя бы один из потоков, которые блокируются при указанной переменной cond cond (если какие-либо потоки заблокированы на cond)". Таким образом, это означает, что pthread_cond_wait()
может быть вызвано многими потоками для одной и той же пары cond-mutex?