2011-11-22 97 views
8

这是关于线程安全的std::map。现在,同时读取是线程安全的,但写入不是。我的问题是,如果我每次向地图添加独特的元素,是否会线程安全?C++映射的线程安全

  1. 所以,举例来说,如果我有一张地图这样std:map<int, std::string> myMap ,我总是添加新键,从来没有修改现有的键值,那将是线程安全的?

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

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

感谢 希夫

+0

不,这不会是线程安全的,因为两个线程可以一次添加两个(唯一的)项目,它们将在同一个地方。 –

+0

你可以从标准容器中得到的唯一线程安全性是,如果容器永远不会被修改,并且每个线程访问(读取或写入)一个**不同的**元素,那应该没问题。 –

回答

14

1)当然不是

2)是的,我希望在测试过程中,你会遇到它,而不是后来

3)是的,它是。新元素被添加到不同的位置,但许多指针在此期间被修改。

在大多数情况下,如果不是所有的实现,该映射都是通过某种树实现的。在树中插入一个新元素,通过重新设置指向不同节点的指针重新排列节点来修改它。所以它不是线程安全的

+1

+1,正好.... –

+0

@armen什么是最好的选择呢? –

+0

@EdwinVivekN:在同时使用STL容器时,您需要使用外部同步机制(例如互斥锁) –

0

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

编辑:http://www.sgi.com/tech/stl/thread_safety.html可能是你感兴趣的。