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