我实现了从网络摄像头检索帧的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;
        }
    }
}

最佳答案

不知道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;
}

关于c++ - 在这种情况下如何正确利用互斥锁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43694907/

10-12 15:34