параллельные потоки в C-программировании - PullRequest
1 голос
/ 04 октября 2010

Я столкнулся с проблемой при реализации условий ожидания и сигналов в нескольких потоках.

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

Ответы [ 3 ]

5 голосов
/ 04 октября 2010

Если два потока ожидают одну и ту же условную переменную, они должны быть готовы обрабатывать одни и те же условия, или вы должны тщательно построить свою программу, чтобы они никогда не ожидали одновременной переменной условия.

Почему это уведомление должно обрабатываться первым потоком, а не вторым?

Вам может быть лучше с двумя отдельными условными переменными.

2 голосов
/ 04 октября 2010

Используйте pthread_cond_signal(), чтобы разбудить один из потоков.

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

0 голосов
/ 28 августа 2011

Ваше требование невозможно.Вы говорите: «... я хочу, чтобы только первый поток, который ожидает, должен был сигнализироваться, а не другие».Но условные переменные никогда не обеспечивают какой-либо способ гарантировать, что поток не будет передан.Поэтому, если у вас есть требование, чтобы поток не передавался, вы не можете использовать условные переменные.

Вы всегда должны использовать условную переменную, например:

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, подобные приведенному выше, не следует использовать переменные условия.

...