【发布时间】:2013-07-11 19:25:38
【问题描述】:
我知道,只要不需要调整大小,就可以读取一些单元格并同时写入 STL 向量的不同单元格。我想知道如果我保证每个线程访问/插入不同的键,是否允许同时获取某些键的值并同时将新的键值对插入到 Visual C++ 2010 中的 STL 映射中。
来自 http://www.cplusplus.com/reference/map/map/operator[]/:
数据竞赛:
容器被访问,并且可能被修改。功能 访问元素并返回可用于修改的引用 它的映射值。同时访问其他元素是安全的。如果 该函数插入一个新元素,同时迭代范围 容器不安全。
也就是说,如果我插入一个新元素,我就不能遍历容器。问题是访问不同的元素是否需要遍历容器。那这样安全吗?
如果我保证容器的大小永远不会超过 N 是否安全?然后也许地图的内部数据结构可以预先分配并保持不变——就像向量的内部结构一样,只要向量没有调整大小。
我知道有可用的 map 线程安全实现,但它们可能要慢得多,所以我想知道标准 map 是否足以满足我的需要,因为我正在修改的代码是我的应用程序。
谢谢, 迈克尔
【问题讨论】:
-
容器保证在插入开始和插入结束时是一致的,但是在两者之间呢?那将是一个奇迹。
-
将地图保持在
N以下大小将对线程安全性绝对没有影响。即使树木保持大致恒定的大小,它们也必须旋转。 -
查找现有元素需要迭代。 编辑是安全的。
标签: c++ map concurrency stl thread-safety