首页 > 解决方案 > 如果我们同时从向量中追加和读取数据,我们是否需要锁定?(无修改)

问题描述

我们知道,如果多个线程对一个对象进行操作并且涉及修改,我们需要某种锁定(原子/互斥锁)。对于我的情况,只有这些操作同时发生在 std::vector 上:

1. Read
2. Append/Push

在这种情况下,向量是否需要锁?如果是,为什么?我的程序基于 CPP。

我是锁概念的新手。任何正确方向的提示都对我有用。

标签: c++vectorappendlockingpush

解决方案


是的,一般来说,您需要锁定,因为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:使用同步:-)


推荐阅读