Abh*_*ain 8 c++ concurrency vector lock-free data-structures
使动态数组线程安全且并发是什么意思?比如说,std::vector.
那么有什么需要做的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)一个线程擦除和其他步行来访问同一个元素是不安全的,因为从向量中删除一个元素不是一个承诺线程安全的操作(或"没有数据竞争",正如标准所说) .
要安全地执行这些操作,将要求程序本身执行一些外部同步.