В критических разделах 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, как в моем случае? Оба потока имеют нулевой приоритет.
А как лучше добавить такую очередь? Достаточно ли простого флага, такого как bDoNotRenderAnything?
Изменить: решение в моем случае было просто добавить объект события (логическая переменная, вероятно, тоже будет работать), который устанавливается каждый раз, когда обработчику сообщений требуется доступ к критическому разделу, и сбрасывается после его использования. Рендерер не входит в раздел, если установлена переменная / событие. Таким образом, обработчику сообщений не придется ждать более одной итерации отрисовки.
viewer->finish
не защищен от одновременного доступа? Он хоть летучий ?? - person UmNyobe   schedule 04.04.2013while
цикл блокируется сразу после разблокировки, что не помогает. - person Roger Rowland   schedule 04.04.2013