c ++映射的线程安全性

时间:2011-11-22 22:16:49

标签: c++ thread-safety

这是关于std::map的线程安全性。现在,同时读取是线程安全的,但写入不是。我的问题是,如果我每次都向地图添加唯一元素,那么它是否是线程安全的?

  1. 所以,举个例子,如果我有这样的地图std:map<int, std::string> myMap 我总是添加新密钥,永远不会修改现有的键值,这是否是线程安全的?

  2. 更重要的是,这会给我任何随机的运行时行为吗?

  3. 添加新密钥是否也被视为修改?如果在添加时键总是不同的,那么它不应该是线程安全的,因为它修改了内存的独立部分吗?

  4. 由于 希夫

2 个答案:

答案 0 :(得分:16)

1)当然不是

2)是的,我希望你会在测试期间遇到它,而不是以后

3)是的,确实如此。新元素添加在不同的位置,但在此期间会修改许多指针。

在大多数(如果不是全部)实现中,地图由某种树实现。在树中插入新元素通过重置指针以指向不同节点来重新排列节点来修改它。所以它不是线程安全的

答案 1 :(得分:1)

不,是的,是的。修改容器时需要获得独占锁(包括插入新密钥),虽然没有修改,但当然可以安全地同时读取。

编辑:http://www.sgi.com/tech/stl/thread_safety.html可能对您有用。