如果同时从vector中追加和读取数据,需要锁吗?(无修改)



我们知道,如果有多个线程操作一个对象,并且涉及到修改,我们需要某种类型的锁定(原子/互斥)。在我的例子中,对于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()会使size()超过capacity()时,您才能摆脱锁定。这是非常棘手和容易出错的:一旦你允许一个线程开始读取,你必须确保没有重新分配将发生在其他线程,甚至之后。

编辑:重写以上。Tl-dr: use synchronization:-)

您很可能需要资源锁定。以这个例子为例,如果向vector插入一个元素,它可能会调整大小。现在,当您调整向量的大小时,如果另一个线程试图从数组访问数据该怎么办?看到冲突了吗?这就是为什么需要锁定资源。现在,如果您插入或删除数据(这意味着您更改了容器的实际分配)。如果大小是固定的(意思是如果你已经预先分配了它),那么就不会有问题。

最新更新