c++ - 在这种情况下如何正确使用互斥锁

标签 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;
        }
    }
}

最佳答案

在不知道 m_frame 究竟如何工作的情况下,我建议您将对可以保存 m_frame 的对象的引用传递给 getFrame() 和您可以安全地 - 使用 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/

相关文章:

c++ - 如何在 C/C++ linux 中实现类似 invokeOnMainThread() 的函数?

c++ - NSObject PerformSelector 问题

c++ - 如何从 const char* 转换为结构?

c++ - 在 c++ r3.0.2 驱动程序中使用连接池连接到 mongodb 拷贝集的正确方法是什么?

c++ - C/++函数如何正确返回值?

python - Tkinter 和线程

c++ - 理解运算符重载的问题

c++ - Python 非平凡的 C++ 扩展

java - 如何根据数组中的类名在java中使用大量对象

c# - 如何从另一个线程在 TreeView 中添加对象