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

How to utilize mutex properly in this scenario

本文关键字:这种情况下 何正确      更新时间:2023-10-16

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