更快的线程阻塞较慢的线程

时间:2014-11-19 10:43:49

标签: c++ windows multithreading performance

我正在使用点云查看器,而我的设计基于两个线程

  • 第一个线程更新点云数据(约10 fps)
  • 第二个线程是D3D渲染器,用于将点集渲染为屏幕(约90 fps)

所以我的代码看起来像这样:

std::shared_ptr<PointCloud> pointcloud;
CRITICAL_SECTION updateLock;
void FirstThreadProc()
{
      while(true)
      {
       /* some algorithm processes point cloud, takes time */
            EnterCriticalSection(&updateLock);
            pointcloud->Update(data,length,...); //also takes time to copy and process
            LeaveCriticalSection(&updateLock);
      }
}
/*...*/  
std::shared_ptr<D3DRenderer> renderer;
void SecondThreadProc()
{
    MSG msg = { 0 };
    while (WM_QUIT != msg.message)
    {
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            EnterCriticalSection(&updateLock);
            renderer->Render(pointcloud);
            LeaveCriticalSection(&updateLock);
        }
    } 
}

我认为第二个线程比第一个线程更快,所以当第一个线程进入临界区时,第二个线程被阻塞,因此渲染器窗口应该立即冻结。但我现在观察到的是渲染器窗口运行非常平滑,相机旋转或放大/缩小,都很好,但第一个线程非常不稳定,其fps范围从10 fps到1 fps。 / p>

我正在考虑两点云缓冲区,然后第一个线程在临界区外部更新第二个缓冲区,然后在临界区内交换两个缓冲区。它会起作用吗?

1 个答案:

答案 0 :(得分:0)

this中所述,CRITICAL_SECTION不提供先进先出(FIFO)排序。因为第二个线程比第一个线程更快,并且它的整个循环是关键部分,它将在离开之后立即进入临界区。这可能总是在关键部分,并保留第一部分。

我的解决方案是将第二个线程的更多工作放在临界区之外,然后它可以正常工作。