Win32 Event против семафора - PullRequest
4 голосов
/ 11 мая 2010

В основном мне нужна замена для Условной переменной и SleepConditionVariableCS, потому что она поддерживает только Vista и UP. (Для C ++)

Некоторые предлагали использовать семафор, я также нашел CreateEvent.

По сути, мне нужно иметь поток, ожидающий на WaitForSingleObject, пока один или несколько других потоков не скажут мне, что нужно что-то делать.

В каком контексте я должен использовать Семафор против Win Event?

Спасибо

Ответы [ 3 ]

3 голосов
/ 11 мая 2010

Замена условных переменных в Windows чрезвычайно сложна и подвержена ошибкам в общем случае. Или:

  1. Использовать чужую реализацию (например, Boost.Thread ).
  2. Переосмыслите проблему, которую вы пытаетесь решить, и посмотрите, сможет ли это сделать Win32. Исходя из вашего описания, события может быть достаточно, но если официант должен быть вызван каким-то условным выражением, которое установят другие потоки, а не просто сигналом, лучше вернуться к варианту 1.
3 голосов
/ 11 мая 2010

Используйте boost :: condition_variable , если это вообще возможно. Я шел по этому пути раньше (см. Сообщение на microsoft.public.win32.programmer.kernel ), и API событий Win32 недостаточно; возникают проблемы с использованием событий.

3 голосов
/ 11 мая 2010

В вашем случае я бы сам использовал событие. Сигнализировать событие, когда вы хотите, чтобы поток начал работу. Работа сделана:)

Редактировать: разница между семафорами и событиями сводится к внутреннему счету. Если существует несколько ReleaseSemaphores, то также будут освобождены 2 WaitForSingleObjects. События булевы по своей природе. Если событие Сигнала происходит в двух разных местах одновременно, ожидание будет сброшено, и оно будет возвращено в состояние без сигнала (в зависимости от того, имеется ли автоматический или ручной сброс). Если вам нужно, чтобы о нем одновременно сообщалось из нескольких мест, а ожидающий поток запускался дважды, то такое поведение события может привести к тупику.

...