首页 > 解决方案 > C++ 线程安全向量插入

问题描述

多个线程处理数据,最后它们都插入/追加结果向量。
我想确保一次只有一个线程在 RESULT 向量中插入元素。
为此,我使用了 mutex 和 lock_guard() 但它们有时会给出无效的访问错误,有时它们不会...
这是我要同步的代码

void insert_output() {
    mutex m;
    lock_guard<mutex> lockGuard(m);
    Resources::results.insert(Resources::results.begin(), output.begin(), output.end());
}

我做错了什么......
还有什么更好的方法来同步这个过程?

标签: c++multithreadingc++11c++14c++17

解决方案


向量必须只有一个互斥锁。因此,您应该在向量旁边添加互斥锁,例如results_mutexResources. 如果results是静态成员,那么互斥锁也应该是静态成员(因此向量只有一个互斥锁)。

然后,您还必须在访问向量的所有操作上锁定互斥锁,这些操作可能与调用并行执行insert_output,而不仅仅是在插入操作上。

在您当前的代码中,您在每次调用时都会创建一个新的互斥锁,这完全没有意义。


推荐阅读