Страницы

Поиск по вопросам

среда, 5 июня 2019 г.

Реализация condition variables

Подскажите правильную реализацию 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);

Комментариев нет:

Отправить комментарий