Подскажите правильную реализацию condition variables. Реализовал на WaitForMultipleObjects() и PulseEvent() , и получил баг, когда поток не просыпался, оказалось это проблема в PulseEvent(). Подскажите правильную реализацию в которой поток будет точно просыпаться и работать как надо.
Ответ
Начиная с Vista, WinAPI содержит синхронизационные примитивы наподобие CONDITION_VARIABLE, которые делают именно то, что вам нужно.
Вот пример использования (из официальной документации):
CONDITION_VARIABLE cv;
CRITICAL_SECTION lock;
InitializeConditionVariable (&cv);
InitializeCriticalSection (&lock);
...
// ожидание
EnterCriticalSection(&lock);
while (!(условие)) // защищаемся от spurious wakeup
SleepConditionVariableCS(&cv, &lock, INFINITE);
// работать с данными можно только внутри критической секции
// и при выполнении условия
работаем_с_данными();
LeaveCriticalSection(&lock);
Комментариев нет:
Отправить комментарий