首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++ std容器的线程安全

C++ std容器的线程安全
EN

Stack Overflow用户
提问于 2013-09-06 11:53:47
回答 4查看 5.4K关注 0票数 12

我在这里阅读了很多文章,询问C++的标准容器(如"list“或"map”)是否是线程安全的,而且它们都说它不是一般的。并行读取应该是可以的,但是并行写入或并行读和写可能会导致问题。

现在我发现在www.cplusplus.com,在大多数操作中访问或修改列表是安全的。

下面是一些例子:

地图::查找

访问容器(无论是const版本还是非const版本都不修改容器)。不访问任何映射值:同时访问或修改元素是安全的。

地图::插入

容器被修改。同时访问现有元素是安全的,尽管容器中的迭代范围不是安全的。

我是cplusplus.com女士,还是还有什么关于std容器中线程安全的知识?

提前感谢!

PS:我要的是C++03,而不是C++11

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-09-06 11:57:25

听起来差不多对。

注意,如果修改实际值,则需要保护从多个线程访问map中的值。如果您知道两个线程更新不同的条目(我不是指插入/删除),那么它是安全的。

票数 6
EN

Stack Overflow用户

发布于 2013-09-06 12:03:57

并行读取应该是可以的,但是并行写入或并行读和写可能会导致问题。

是这样的。这是对C++中对象的非同步访问的一般保证。这种“问题”被正式称为数据竞赛。

现在我发现在www.cplusplus.com,在大多数操作中访问或修改列表是安全的。

不,容器提供的只是并发读取的基本保证。如果一个线程访问它,而另一个线程修改它,就会发生数据竞争。但是,对于某些容器,有时在修改容器本身时访问容器的元素是安全的。

第一个例子是,find不修改容器或访问元素值(只有键),因此如果其他线程正在访问它,或者修改(不同的)值而不修改容器本身,也是安全的。

第二个例子是,您可以安全地访问现有元素(使用对该元素的引用或迭代器),因为插入元素不会干扰现有元素。

我要的是C++而不是C++11

如今,C++是C++11。如果你问的是这种语言的历史版本,他们对线程就没什么好说的了,所以这个问题一般是不能回答的,只能针对特定的实现和线程框架。

票数 13
EN

Stack Overflow用户

发布于 2013-09-06 11:56:04

在C++11之前,标准中没有“线程”的概念。因此,在C++03上下文中,容器是否是线程安全的问题是毫无意义的。

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

https://stackoverflow.com/questions/18657249

复制
相关文章

相似问题

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