c++ - 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());
}
我做错了什么......
还有什么更好的方法来同步这个过程?
解决方案
向量必须只有一个互斥锁。因此,您应该在向量旁边添加互斥锁,例如results_mutex
在Resources
. 如果results
是静态成员,那么互斥锁也应该是静态成员(因此向量只有一个互斥锁)。
然后,您还必须在访问向量的所有操作上锁定互斥锁,这些操作可能与调用并行执行insert_output
,而不仅仅是在插入操作上。
在您当前的代码中,您在每次调用时都会创建一个新的互斥锁,这完全没有意义。
推荐阅读
- ios - 斯威夫特:测验应用程序,“超时!” 计时器 = 0 时的消息
- javascript - 使用函数传递数组进行排序
- python - 网页抓取时禁止四处走动
- java - 为什么“类型绑定不匹配:类型?extends T 不是有界参数的有效替代品
> 枚举类型 “? - html - 引导轮播上的对齐按钮
- bash - 如何从 bash 脚本启动多个屏幕会话
- flask-sqlalchemy - 超链接到内联表单标签
- javascript - Array.reduce 中的参数名称应该是什么?
- c# - 从另一个类获取字符串不返回任何结果
- angular - 从反应式表单Angular中的元素自动创建FormControls