在多线程中是否可能发生读取对象的一半大小?

Is possible read half size of object happen in multi-thread?

本文关键字:一半 取对象 读取 多线程 是否 可能发生      更新时间:2023-10-16

有两个线程,一个产品数据,另一个过程数据。 数据不仅仅是一个intfloat,而是一个复杂的对象。就我而言,这是一个OpenCV Mat(图像)。 如果第一个线程只创建了图像的一半大小,而第二个线程读取它,会得到图像的一半大小吗?图像会坏吗?

int main(int argc, char *argv[])
{
cv::Mat buffer;
cv::VideoCapture cap;
std::mutex mutex;
cap.open(0);
std::thread product([](cv::Mat& buffer, cv::VideoCapture cap, std::mutex& mutex){
while (true) { // keep product the new image
cv::Mat tmp;
cap >> tmp;
//mutex.lock();
buffer = tmp.clone();
//mutex.unlock();
}
}, std::ref(buffer), cap, std::ref(mutex));
product.detach();
int i;
while (true) { // process in the main thread
//mutex.lock();
cv::Mat tmp = buffer;
//mutex.unlock();
if(!tmp.data)
std::cout<<"null"<<i++<<std::endl;
else {
//std::cout<<"not null"<<std::endl;
cv::imshow("test", tmp);
}
if(cv::waitKey(30) >= 0) break;
}
return 0;
}

我是否需要在写入和读取周围添加互斥锁以确保映像不会损坏?喜欢这个:

int main(int argc, char *argv[])
{
cv::Mat buffer;
cv::VideoCapture cap;
std::mutex mutex;
cap.open(0);
std::thread product([](cv::Mat& buffer, cv::VideoCapture cap, std::mutex& mutex){
while (true) { // keep product the new image
cv::Mat tmp;
cap >> tmp;
mutex.lock();
buffer = tmp.clone();
mutex.unlock();
}
}, std::ref(buffer), cap, std::ref(mutex));
product.detach();
while (true) { // process in the main thread
mutex.lock();
cv::Mat tmp = buffer;
mutex.unlock();
if(!tmp.data)
std::cout<<"null"<<std::endl;
else {
std::cout<<"not null"<<std::endl;
cv::imshow("test", tmp);
}
}
return 0;
}

这个问题涉及到如何解决图像处理导致相机io延迟?

一旦一个线程修改一个对象,而另一个线程可能同时访问同一对象的值,你就会出现争用条件,并且行为是未定义的。是的,这可能会发生。而且,由于我们在这里谈论的是像整个图像缓冲区这样的对象,因此几乎肯定会发生。是的,您将需要使用适当的同步来防止它发生。

从您的描述来看,您在这里似乎基本上遇到了一种情况,即一个线程正在生成一些图像,而另一个线程必须等待图像准备就绪。在这种情况下,您应该问自己的第一个问题是:如果第二个线程无法在第一个线程完成其工作之前开始工作,那么在这里使用第二个线程究竟获得了什么?如果两个线程仍然可以并行完成足够的工作以使这一切有意义,那么您很可能不仅希望在这里使用简单的互斥锁,还希望使用更多类似的东西,例如条件变量或屏障......