我在这里阅读了很多文章,询问C++的标准容器(如"list“或"map”)是否是线程安全的,而且它们都说它不是一般的。并行读取应该是可以的,但是并行写入或并行读和写可能会导致问题。
现在我发现在www.cplusplus.com,在大多数操作中访问或修改列表是安全的。
下面是一些例子:
地图::查找
访问容器(无论是const版本还是非const版本都不修改容器)。不访问任何映射值:同时访问或修改元素是安全的。
地图::插入
容器被修改。同时访问现有元素是安全的,尽管容器中的迭代范围不是安全的。
我是cplusplus.com女士,还是还有什么关于std容器中线程安全的知识?
提前感谢!
PS:我要的是C++03,而不是C++11
发布于 2013-09-06 11:57:25
听起来差不多对。
注意,如果修改实际值,则需要保护从多个线程访问map
中的值。如果您知道两个线程更新不同的条目(我不是指插入/删除),那么它是安全的。
发布于 2013-09-06 12:03:57
并行读取应该是可以的,但是并行写入或并行读和写可能会导致问题。
是这样的。这是对C++中对象的非同步访问的一般保证。这种“问题”被正式称为数据竞赛。
现在我发现在www.cplusplus.com,在大多数操作中访问或修改列表是安全的。
不,容器提供的只是并发读取的基本保证。如果一个线程访问它,而另一个线程修改它,就会发生数据竞争。但是,对于某些容器,有时在修改容器本身时访问容器的元素是安全的。
第一个例子是,find
不修改容器或访问元素值(只有键),因此如果其他线程正在访问它,或者修改(不同的)值而不修改容器本身,也是安全的。
第二个例子是,您可以安全地访问现有元素(使用对该元素的引用或迭代器),因为插入元素不会干扰现有元素。
我要的是C++而不是C++11
如今,C++是C++11。如果你问的是这种语言的历史版本,他们对线程就没什么好说的了,所以这个问题一般是不能回答的,只能针对特定的实现和线程框架。
发布于 2013-09-06 11:56:04
在C++11之前,标准中没有“线程”的概念。因此,在C++03上下文中,容器是否是线程安全的问题是毫无意义的。
https://stackoverflow.com/questions/18657249
复制相似问题