C ++多线程崩溃应用程序

时间:2018-03-27 13:47:27

标签: c++ multithreading opencv thread-safety

我正在尝试运行2个线程,一个获取屏幕截图并更改全局图像变量,另一个读取图像并检测对象。 当我使用std :: mutex锁定图像时,一切正常:

线程1

void mHandler()
{
    while (true) {
      mat_img_mutex.lock();
      mat_img = hwnd2mat(); //screenshot is taken and saved into global mat_img
      mat_img_mutex.unlock();
      Sleep(3);
   }
}

线程2

mat_img_mutex.lock();
result_vec = detector.detect(mat_img); //image detection
mat_img_mutex.unlock();

到目前为止一切都那么好,但这并不能帮助我,因为它阻止了彼此的线程执行,所以它没有任何性能优势而只是使用一个线程。

我尝试了什么: Thread1,将屏幕截图功能从互斥锁中取出,因此只有变量定义发生在互斥锁中。这虽然破坏了程序,但我不明白为什么。

void mHandler()
{
    while (true) {
      cv::Mat img_copy = hwnd2mat(); //heavy screenshot function out of the mutex
      mat_img_mutex.lock();
      mat_img = img_copy //screenshot is taken and saved into global mat_img
      mat_img_mutex.unlock();
      Sleep(3);
   }
}

Thread2,我也尝试将检测功能从互斥锁中取出同样的想法导致崩溃,这很奇怪,因为我认为c ++ inst的复制指导员引用了变量,所以不应该这样做有同时读/写的任何问题......

1 个答案:

答案 0 :(得分:0)

cv :: Mat使用引用计数。确保获得数据的副本。使用

mat_img = img_copy.clone()

获取图像的深层副本。