Я изучаю условия и жду условия. Насколько я могу судить, типичная ожидающая нить выглядит так:
pthread_mutex_lock(&m);
while(!condition)
pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
Что я не могу понять, так это то, почему необходима строка while(!condition)
, даже если я использую pthread_cond_signal()
для пробуждения потока.
Я могу понять, что если я использую pthread_cond_broadcast()
, мне нужно проверить условие, потому что я просыпаюсь всех ожидающих потоков, и один из них может снова сделать условие ложным, прежде чем разблокировать мьютекс (и, таким образом, передать выполнение к другому пробужденному потоку, который не должен выполняться в этот момент).
Но если я использую pthread_cond_signal()
, я просыпаюсь только с одним потоком, поэтому условие должно быть истинным. Таким образом, код может выглядеть так:
pthread_mutex_lock(&m);
pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
Я читал кое-что о ложных сигналах, которые могут произойти. Это (и только это) причина? Почему у меня должны быть ложные песни? Или есть что-то еще, чего я не понимаю?
Я предполагаю, что код сигнала такой:
pthread_mutex_lock(&m);
condition = true;
pthread_cond_signal(&cond); // Should wake up *one* thread
pthread_mutex_unlock(&m);