Страницы

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

воскресенье, 15 марта 2020 г.

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

#cpp #windows #winapi


Подскажите правильную реализацию condition variables. Реализовал на WaitForMultipleObjects()
и PulseEvent() , и получил баг, когда поток не просыпался, оказалось это проблема в
PulseEvent(). Подскажите правильную реализацию в которой поток будет точно просыпаться
и работать как надо.
    


Ответы

Ответ 1



Начиная с 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);

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

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