在多线程中是否可能发生读取对象的一半大小?
Is possible read half size of object happen in multi-thread?
有两个线程,一个产品数据,另一个过程数据。 数据不仅仅是一个int
或float
,而是一个复杂的对象。就我而言,这是一个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延迟?
一旦一个线程修改一个对象,而另一个线程可能同时访问同一对象的值,你就会出现争用条件,并且行为是未定义的。是的,这可能会发生。而且,由于我们在这里谈论的是像整个图像缓冲区这样的对象,因此几乎肯定会发生。是的,您将需要使用适当的同步来防止它发生。
从您的描述来看,您在这里似乎基本上遇到了一种情况,即一个线程正在生成一些图像,而另一个线程必须等待图像准备就绪。在这种情况下,您应该问自己的第一个问题是:如果第二个线程无法在第一个线程完成其工作之前开始工作,那么在这里使用第二个线程究竟获得了什么?如果两个线程仍然可以并行完成足够的工作以使这一切有意义,那么您很可能不仅希望在这里使用简单的互斥锁,还希望使用更多类似的东西,例如条件变量或屏障......
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 如何将图像的字节数组(取自 s3)转换为 C++ 或 C 中的图像/图像对象
- 在多线程中是否可能发生读取对象的一半大小?
- D3DXVec3项目需要一半的对象位置
- Boost.python 将对象拉取到本地范围内以进行读取访问
- 取两个size_t对象的差异是否安全
- 如何使用英特尔预取pragma时,数据隐藏在一个对象