使动态数组线程安全和并发意味着什么?比如说,std::vector。
那么,在std::vector上需要做些什么才能使其线程安全和并发,还是默认情况下是线程安全和并发?
发布于 2015-06-30 07:16:52
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)一个线程擦除和另一个遍历访问同一个元素是不安全的,因为从向量中擦除元素并不是一个保证线程安全的操作(或者像标准所说的“不受数据竞争的影响”)。
为了安全地执行这些操作,程序需要强制执行一些外部同步本身。
发布于 2015-06-30 07:34:19
默认情况下,标准库中单个对象上唯一安全的并发操作是--仅访问const-member函数--所有对同步原语的访问(如互斥锁和解锁或原子操作)都必须是外部同步的。特别是,标准库还没有任何线程安全容器(截至c++14)。
所以这两个例子的答案都是否定的,它们都需要某种形式的外部同步。
当然,您可以做的是修改容器中两个不同元素的值。
https://stackoverflow.com/questions/31131743
复制相似问题