如何在此方案中正确使用互斥锁

时间:2017-04-29 11:09:15

标签: c++ multithreading

我已经实现了从网络摄像头检索帧的Cam类。 Cam类有自己的获取帧的线程。代码运行顺利。我想要做的是实现能够在适当的小部件中显示帧的GUI类。成员数据m_frame保存当前图像,应该可以从两个独立的线程访问它。我的问题是我应该在哪里使用mutex安全地访问框架?是否足以在getFrame()使用它,如下所示:

cv::Mat Cam::getFrame()
{ 
std::lock_guard<std::mutex> lock(mtx)
return m_frame;
}

或者在独立线程中修改m_frame的位置如下:

void Cam::getFrameFromCam()
{
    // Independent Thread 
    while( m_isCamThreadRunning ){
        if ( m_isCamOpen ){
             std::lock_guard<std::mutex> lock(mtx);
            // acquire frame 
            *cap >> m_frame;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

在不知道m_frame的确切工作原理的情况下,我建议您传递给getFrame()对可以容纳m_frame的对象的引用,并且可以安全地使用std::lock_guard - 将其复制到提供的参考文献中。

东西 - 抽象代码 - 像这样[我对复制cv::Math]一无所知:

cv::Mat & Cam::getFrame( cv::Math & myCopyOfFrame )
{ 
   std::lock_guard<std::mutex> lock(mtx);
   myCopyOfFrame = m_frame;
   return myCopyOfFrame;
}