首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >默认情况下,std::向量线程安全并并发吗?为什么或者为什么不?

默认情况下,std::向量线程安全并并发吗?为什么或者为什么不?
EN

Stack Overflow用户
提问于 2015-06-30 07:07:09
回答 2查看 7.1K关注 0票数 12

使动态数组线程安全和并发意味着什么?比如说,std::vector

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

那么,在std::vector上需要做些什么才能使其线程安全和并发,还是默认情况下是线程安全和并发?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-30 07:16:52

C++11对标准库中容器的线程进行了如下描述:

23.2.2容器数据竞赛container.requirements.dataraces 为了避免数据竞争(17.6.5.9),实现必须考虑以下功能:beginendrbeginrendfrontbackdatafindlower_boundupper_boundequal_rangeat,以及除关联或无序关联容器之外,operator[]。 尽管如此(17.6.5.9),当包含的对象在同一序列中的不同元素中的内容(除了vector<bool> )被并发修改时,实现仍然需要避免数据竞争。

因此,从多个线程读取容器基本上是很好的,修改容器中已经存在的元素也很好(只要它们是不同的元素)。

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

1)插入到向量中的两个线程正在修改向量本身--不存在单独的元素。

2)一个线程擦除和另一个遍历访问同一个元素是不安全的,因为从向量中擦除元素并不是一个保证线程安全的操作(或者像标准所说的“不受数据竞争的影响”)。

为了安全地执行这些操作,程序需要强制执行一些外部同步本身。

票数 21
EN

Stack Overflow用户

发布于 2015-06-30 07:34:19

默认情况下,标准库中单个对象上唯一安全的并发操作是--仅访问const-member函数--所有对同步原语的访问(如互斥锁和解锁或原子操作)都必须是外部同步的。特别是,标准库还没有任何线程安全容器(截至c++14)。

所以这两个例子的答案都是否定的,它们都需要某种形式的外部同步。

当然,您可以做的是修改容器中两个不同元素的值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31131743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档