2016-12-21 6 views
0

Я пытаюсь обернуть голову вокруг переменных условия pthread. Я видел некоторые примеры кода, которые используют pthread_cond_wait и pthread_cond_signal, и все они выглядят следующим образом:Об использовании pthread_cond_wait

while (condition) 
{ 
    // Assume that the mutex is locked before the following call 
    pthread_cond_wait(&cond, &mutex); 
} 

Есть ли причина для использования цикла, а на состоянии? почему бы просто не использовать одно выражение if?

+0

Как это связано с C++? – Olaf

+0

Я удалил тег, спасибо. –

ответ

1

Ложные пробуждений.

См Why does pthread_cond_wait have spurious wakeups?, а также https://en.wikipedia.org/wiki/Spurious_wakeup:

паразитных будильником описывает осложнение при использовании переменных условия, как это предусмотрено некоторыми многопоточных API-интерфейсы, такие как POSIX Threads и Windows API.

Даже после того, как переменная условия, как представляется, была указана с точки зрения ожидающего потока , ожидаемое условие может быть по-прежнему ложным. Одной из причин этого является ложное пробуждение; что есть, поток может быть разбужен из состояния ожидания, хотя нить нить сигнализировала переменную условия. Для правильности необходимо указать , чтобы убедиться, что условие действительно верно после того, как поток завершил ожидание. Поскольку поддельное пробуждение может произойти несколько раз, это достигается путем ожидания внутри цикла, который заканчивается , когда условие истинно ...

+0

Простудистые пробуждения - это часть причины, но не вся причина. –

+0

@JohnBollinger Вы имеете в виду причины, упомянутые здесь: http://stackoverflow.com/a/8594644/4756299? –

+0

Я утверждаю, что «поток, заблокированный в pthread_cond_wait, возвращается из-за вызова сигнала или широковещательной передачи, однако после повторного обнаружения мьютекса найденный ниже предикат уже не является истинным» (цитируется из вашей ссылки SO) не классифицируется должным образом как «сильное пробуждение». Ваша статья в Википедии, похоже, согласна со мной по этой детали терминологии. –

1

Я считаю, что это связано с тем, что потоки могут быть просверлены до того, как условие выполнено. Мужчина, поговорим о «gotcha's».

Из документации Open Группы:
"Ложных пробуждений от pthread_cond_wait() или pthread_cond_timedwait() функция может произойти."

Источник:
http://pubs.opengroup.org/onlinepubs/007908775/xsh/pthread_cond_wait.html

1

Есть ли причина для использования цикла, а на состоянии? почему бы просто не использовать одно выражение if?

Идея переменных состояния заключается в приостановлении выполнения потока до тех пор, пока не будет выполнено заданное условие. Однако условие не встроено в переменную, оно должно быть предоставлено программистом.

Если соответствующее условие уже выполнено, то нет необходимости приостанавливать работу. Ключ здесь, однако, заключается в том, что когда возобновляется поток, условие может быть еще не выполнено, либо потому, что что-то изменилось между передаваемой переменной условия и потоком, способным продолжить, или потому, что поток просыпался отрывочно (это допускается, хотя это редко бывает). Таким образом, программа проверяет условие снова при каждом пробуждении, чтобы увидеть, должно ли оно возобновиться.

Смежные вопросы