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