c++ - C++ 标准容器的线程安全

标签 c++ multithreading std c++03

我在这里阅读了很多关于 C++ 的标准容器(如“list”或“map”)是否线程安全的帖子,他们都说这不是一般的。并行读取应该没问题,但是并行写入或并行读取和写入可能会导致问题。

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

一些例子:

map::find

容器被访问(const 和非 const 版本都不会修改容器)。 没有访问映射值:并发访问或修改元素是安全的。

map::insert

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

我是否误解了 cplusplus.com,或者关于 std 容器中的线程安全还有什么我必须知道的。

提前致谢!

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

最佳答案

Parallel reads should be OK, but parallel writes or parallel reads and writes may cause problems.

没错。这是为 C++ 中对象的非同步访问提供的一般保证。这种“问题”的正式名称是数据竞争

Now I found out that at www.cplusplus.com that accessing or modifying the list during most of the operations is safe.

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

第一个例子是说find 修改容器或访问元素(仅键),所以如果其他线程正在访问它,或者在不修改容器本身的情况下修改(不同的)值。

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

I'm asking for C++ and not for C++11

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

关于c++ - C++ 标准容器的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18657249/

相关文章:

c++ - C++中构造函数和方法的困惑

c++ - 使用具有 C++20 概念的继承类从模板类继承

java - 如何模拟并行运行的线程之间的竞争?

node.js - 在单独的线程 Node Js 中运行长时间运行的快速 API 进程

c++ - 在 C++ 中在 map 的键上设置交集

c++ - 与 CppUnitTestFramework 的继承

c++ - C++ 中的 K/APL 风格编程?

c# - 让多个线程工作并等待所有线程完成的最佳方法是什么?

适用于字节数组的 C++ 类(如字符上的字符串)

c++ - std::unordered_set::reserve 对于容器内存需求的作用?