我在这里阅读了很多关于 C++ 的标准容器(如“list”或“map”)是否线程安全的帖子,他们都说这不是一般的。并行读取应该没问题,但是并行写入或并行读取和写入可能会导致问题。
现在我发现在 www.cplusplus.com在大多数操作期间访问或修改列表是安全的。
一些例子:
容器被访问(const 和非 const 版本都不会修改容器)。 没有访问映射值:并发访问或修改元素是安全的。
容器被修改。 并发访问现有元素是安全的,尽管在容器中迭代范围是不安全的。
我是否误解了 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/