Не существует ли концепции очереди в критических разделах Windows?Очередь критической секции
У меня есть следующие визуализации цикла в выделенном потоке:
while (!viewer->finish)
{
EnterCriticalSection(&viewer->lock);
viewer->renderer->begin();
viewer->root->render(viewer->renderer);
viewer->renderer->end();
LeaveCriticalSection(&viewer->lock);
}
Основной поток выполняет обработку сообщений, и, когда я обрабатывать события мыши, я пытаюсь войти в ту же критическую секцию, но по какой-то причине, он запускает поток рендеринга для еще тысячи итераций (около 10 секунд), прежде чем основной поток, наконец, войдет в критический раздел. Что вызывает это - даже если в этот раздел нет «очереди», разве это не должно быть больше 50/50 вместо 99.9/0.1, как в моем случае? Оба потока имеют приоритет 0.
И что такое хороший способ добавить такую очередь? Достаточно ли простого флага, такого как bDoNotRenderAnything?
Редактировать: решение в моем случае было просто добавить объект события (вероятно, будет работать и логическая переменная), которая устанавливается каждый раз, когда обработчик сообщения нуждается в доступе к критическому разделу и сбрасывается после его использования. Средство визуализации не входит в раздел, если установлена переменная/событие. Таким образом, обработчику сообщений не придется ждать более одной итерации рендеринга.
Почему 'viewer-> finish' не защищен от одновременного доступа? Является ли он хотя бы неустойчивым? – UmNyobe
Ваш цикл 'while' блокируется сразу после разблокировки, что не помогает. –
Каковы приоритеты ваших основных и рендеринговых потоков? –