Ваше требование невозможно.Вы говорите: «... я хочу, чтобы только первый поток, который ожидает, должен был сигнализироваться, а не другие».Но условные переменные никогда не обеспечивают какой-либо способ гарантировать, что поток не будет передан.Поэтому, если у вас есть требование, чтобы поток не передавался, вы не можете использовать условные переменные.
Вы всегда должны использовать условную переменную, например:
while(NotSupposedToRun)
pthread_cond_wait(...);
Так что, если поток просыпаетсядо 1006 * по-прежнему false
и поток просто возвращается в спящий режим.Это обязательно , поскольку POSIX никогда не дает никаких гарантий, что поток не будет разбужен.Реализация совершенно свободна для реализации pthread_cond_signal
как вызова pthread_cond_broadcast
и разблокирования всех потоков на каждом сигнале, если она этого хочет.
Поскольку переменные условия не сохраняют состояние, реализация никогда не знает, предполагается ли потокпроснуться или нет наверняка.Ваша задача вызывать pthread_cond_wait
всегда и только тогда, когда поток не должен работать.
Подробнее см. http://en.wikipedia.org/wiki/Spurious_wakeup.
Если вы не можете точно указатьусловия пробуждения для каждого потока в цикле while
, подобные приведенному выше, не следует использовать переменные условия.