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

mrw*_*ner 11 c++ multithreading stl c++03

我在这里阅读了很多帖子,问题是C++的标准容器(如"list"或"map"是线程安全的,所有人都说它不是一般的.并行读取应该没问题,但并行写入或者并行读写可能会导致问题.

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

一些例子:

地图::找到

访问容器(const和非const版本都不会修改容器).不访问映射值:同时访问或修改元素是安全的.

地图::插入

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

我是否想念cplusplus.com或者我还有什么关于std容器中线程安全的知识.

提前致谢!

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

Mik*_*our 12

并行读取应该没问题,但并行写入或并行读取和写入可能会导致问题.

那是对的.这是对C++中对象的非同步访问提供的一般保证.这些"问题"正式称为数据竞赛.

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

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

第一个例子是说,find不会改变容器或接入元件(仅键),因此是安全的,如果其他线程访问它,或修改,而无需修改容器本身(不同的)值.

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

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

目前,C++ C++ 11.如果你问的是语言的历史版本,他们对线程没有什么可说的,所以问题一般不负责任,只针对特定的实现和线程框架.


Mat*_*son 5

听起来很对.

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