我正在尝试运行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的复制指导员引用了变量,所以不应该这样做有同时读/写的任何问题......
答案 0 :(得分:0)
cv :: Mat使用引用计数。确保获得数据的副本。使用
mat_img = img_copy.clone()
获取图像的深层副本。