C++ 较快的线程会阻塞较慢的线程

C++ 较快的线程会阻塞较慢的线程,c++,windows,multithreading,performance,C++,Windows,Multithreading,Performance,我正在开发一个点云查看器,我的设计基于两个线程 第一个线程更新约10 fps的点云数据 第二个线程是D3D渲染器,用于将点集渲染为90 fps左右的屏幕 因此,我的代码如下所示: std::shared_ptr<PointCloud> pointcloud; CRITICAL_SECTION updateLock; void FirstThreadProc() { while(true) { /* some algorithm processes

我正在开发一个点云查看器,我的设计基于两个线程

第一个线程更新约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不等

我考虑两个点云缓冲区,然后第一个线程在临界区外更新第二个缓冲区,然后在临界区内交换两个缓冲区。行吗

如中所述,关键章节不提供先进先出订单。因为第二个线程比第一个线程快得多,而且它的整个循环都是临界段,所以它在离开临界段后会立即进入临界段。这可能总是在关键部分,并将第一个排除在外


我的解决方案是将第二个线程的更多作业放在关键部分之外,然后它就可以正常工作。

您尝试时出现了什么问题?@KerrekSB我不明白……您的问题是它会工作吗?我的问题是,为什么你有理由相信它不会。这个问题似乎离题了,因为它是关于一个从未实际存在过的假设问题。。。。尽管仅供参考:是的,像这样的双缓冲甚至三缓冲是完全正常的,很多人都成功地使用了它。