【发布时间】:2013-03-26 04:41:47
【问题描述】:
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不受并发访问保护?它至少是不稳定的吗?? -
您的
while循环在解锁后立即锁定,这没有帮助。 -
主线程和渲染线程的优先级是什么?
-
因为 viewer->finish 只被主线程修改。优先级都为零。我认为可能是这种情况,但它不应该至少在再次进入临界区之前检查其他线程是否试图承担控制权吗?
标签: c++ winapi critical-section