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