c++ - 如果我们同时从向量中追加和读取数据,我们是否需要锁定?(无修改)
问题描述
我们知道,如果多个线程对一个对象进行操作并且涉及修改,我们需要某种锁定(原子/互斥锁)。对于我的情况,只有这些操作同时发生在 std::vector 上:
1. Read
2. Append/Push
在这种情况下,向量是否需要锁?如果是,为什么?我的程序基于 CPP。
我是锁概念的新手。任何正确方向的提示都对我有用。
解决方案
是的,一般来说,您需要锁定,因为push_back
可能会导致重新分配。
您可以检查参考:
https://en.cppreference.com/w/cpp/container/vector/push_back说
如果新的 size() 大于 capacity() 则所有迭代器和引用(包括过去的迭代器)都将失效。否则只有过去的迭代器无效。
https://www.cplusplus.com/reference/vector/vector/push_back/提到:
容器被修改。如果发生重新分配,所有包含的元素都会被修改。否则,不会访问现有元素,同时访问或修改它们是安全的。
所以,如果你想小心,你应该锁定。或者,如果您关心干净的可维护代码。
push_back()
如果您需要额外的性能并且知道自己在做什么,那么只有当您知道 no会带来size()
above时,您才能摆脱锁定capacity()
。这是非常棘手且容易出错的:一旦您允许一个线程开始读取,您必须确保在其他线程中不会发生重新分配,甚至更晚。
编辑:上面重新措辞。tl-dr:使用同步:-)
推荐阅读
- mitmproxy - 如何配置 mitmproxy YAML 以自动更改响应状态代码?
- multithreading - 以不同的形式停止 ITask
- azure-cognitive-services - 表单识别器 - API 调用
- mysql - 从 mysql 文本字段中的 json 中删除属性的最快方法
- reactjs - 在“Npm Start”上找不到所需文件
- seo - robots.txt 目录禁用第 4 级和下一级
- php - 从 Wordpress 中的 Learndash 查询以获取所有已注册的课程
- javascript - 无效的路由选项()“值”必须是一个对象 - Hapi.js/Node.js
- javascript - 我已经在节点 js 中的确切时间每月安排一次 Cron 作业,如果由于某种原因服务器在那段时间发生故障怎么办?
- javascript - node.js - 无法导入已安装的包