我们知道,如果有多个线程操作一个对象,并且涉及到修改,我们需要某种类型的锁定(原子/互斥)。在我的例子中,对于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插入一个元素,它可能会调整大小。现在,当您调整向量的大小时,如果另一个线程试图从数组访问数据该怎么办?看到冲突了吗?这就是为什么需要锁定资源。现在,如果您插入或删除数据(这意味着您更改了容器的实际分配)。如果大小是固定的(意思是如果你已经预先分配了它),那么就不会有问题。