#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);
Комментариев нет:
Отправить комментарий