在这种情况下如何正确使用互斥锁
How to utilize mutex properly in this scenario
我已经实现了从网络摄像头检索帧的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 ++的新手,你能解释一下在这种情况下的指针吗
- 在这种情况下,java对象是否可以调用本机函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 在这种情况下,我真的复制了字节还是复制了字符?
- 为什么在这种情况下,bool 类型的输出等于 0?
- 我是否访问了已释放的内存,或者在这种情况下DrMemory报告不正确?
- 在这种情况下,有什么正确的方法可以实现锁定吗?
- 在这种情况下如何正确使用互斥锁
- 在这种情况下,为什么Sfinae对我来说不正确以及如何修复它
- 在这种情况下,如何正确使用 std::enable_if
- 在这种情况下,如何正确使用ifstream的引用?错误C2248
- 这是存储 std::分配器状态的正确方法 - 在这种情况下,由 Windows 上的共享内存支持
- 在这种情况下如何正确回溯
- 在这种情况下如何正确使用 qmake
- 在这种情况下,我如何正确执行const_cast
- 为什么编译器在这种情况下选择了不正确的函数重载
- 下面哪个选项在这种情况下是正确的?
- 为什么在这种情况下没有调用复制构造函数-我的推理正确吗?
- 在这种情况下,如何正确使用 RAII/减少内存泄漏
- cin是在这种情况下使用的正确函数吗