c ++ - 原子的矢量完全线程安全吗?

dvs*_*s23 5 c++ concurrency vector atomic

我有一个std::vector<std::atomic<size_t>>vec.vec[index].fetch_add(1, std::memory_order_release)在多个并发线程上运行或存储/加载是否安全?我认为它应该是,因为读取是线程安全的,并且由于原子的原因,从多个线程同时写入一个条目是不可能的 - 是吗?

Bat*_*eba 6

通常,它不是线程安全的,因为容器本身不是原子的.

也就是说,只要你不改变向量中的内容(即做任何使返回无效的东西data()),你就没事了.

可悲的是,你不能诉诸于std::atomic<std::vector<...>>一个std::vector不可轻易复制的东西.

  • 只要您不通过增加、缩小或擦除向量中的元素来使这些元素无效,元素的原子读取和写入就可以了,是的。 (2认同)