std :: vector是否是线程安全的并且默认是并发的?为什么或者为什么不?

Abh*_*ain 8 c++ concurrency vector lock-free data-structures

使动态数组线程安全且并发是什么意思?比如说,std::vector.

  1. 两个线程可能想要插入相同的位置.不需要同步,因为它将根据线程调度完成.
  2. 一个线程擦除而另一个线程将访问相同的元素?这不是数据结构问题我认为,这是一个使用问题.

那么有什么需要做的std::vector才能使它成为线程安全和并发的,或者它是默认的线程安全和并发的吗?

Mic*_*urr 17

C++ 11说明了标准库中容器的安全线程:

23.2.2集装箱数据竞赛[container.requirements.dataraces]

为了避免数据争用(17.6.5.9)的目的,实施方式应考虑以下功能为常量:begin,end, rbegin,rend,front,back,data,find,lower_bound, upper_bound,equal_range,at和,除了在缔合或无序关联式容器,operator[].

尽管如此(17.6.5.9),当同一序列中不同元素中包含的对象的内容vector<bool>同时被修改时,需要实现以避免数据争用.

因此,基本上从多个线程中读取容器是可以的,并且修改已经在容器中的元素是可以的(只要它们是不同的元素).

因此,您的两个更具体的问题都不是线程安全的std::vector:

1)插入向量的两个线程正在修改向量本身 - 不是现有的单独元素.

2)一个线程擦除和其他步行来访问同一个元素是不安全的,因为从向量中删除一个元素不是一个承诺线程安全的操作(或"没有数据竞争",正如标准所说) .

要安全地执行这些操作,将要求程序本身执行一些外部同步.

  • 我认为重要的部分是隐含的:添加或删除*不是*线程安全的.应该修改这个答案,说除了所描述的那些之外的任何其他操作都不是*安全的 (2认同)
  • @JoachimPileborg:插入操作不是列为"数据竞争安全"的操作.因此,23.2.2并未暗示您描述的安全情况. (2认同)