我目前正在研究多线程闭路电视系统。我创建一个变量
vector<cv::Mat> all_camera_frame
在主线程中。比我将元素传递给不同的线程。对于每个线程,它创建一个局部变量cv::Mat frame
以从相机获取帧,而不是将帧复制到缓冲区。为了加快速度,我使用 std::swap(all_camera_frame[0], frame);
而不是 all_camera_frame[0] = frames.clone();
。它可以工作,但我想知道它是否安全?我检查了swap函数发现它交换了元素指针和mata数据,但是一个在堆上一个在堆栈上,如果线程结束会发生什么?是否会导致分段错误,因为主线程元素现在是由线程创建但已经被销毁的东西?
我是 C++ 新手,确实需要一些帮助。
在多线程中交换向量安全吗?
不。一点也不安全。
std::swap
不是原子操作。
std::mutex
)。
否则你会遇到竞争条件,导致 UB(未定义的行为)。
这意味着任何事情都可能发生,包括(但不一定)分段错误。
该程序甚至可能看起来工作正常,但你不能依赖它。