Я изучаю условия pthread и wait. Насколько я могу судить, типичный ожидающий поток выглядит так:
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);