2010-05-11 2 views
4

В основном мне нужна замена Condition Variable и SleepConditionVariableCS, потому что она поддерживает только Vista и UP. (Для C++)Win32 Event vs Semaphore

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

В принципе, мне нужно, чтобы на потоке ожидали WaitForSingleObject, пока что-то одно или несколько других нитей не скажут мне, что есть что-то делать.

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

Thanks

ответ

3

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

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

3

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

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