这是关于线程安全的std::map
。现在,同时读取是线程安全的,但写入不是。我的问题是,如果我每次向地图添加独特的元素,是否会线程安全?C++映射的线程安全
所以,举例来说,如果我有一张地图这样
std:map<int, std::string> myMap
,我总是添加新键,从来没有修改现有的键值,那将是线程安全的?更重要的是,这会给我任何随机的运行时行为吗?
添加新密钥也被认为是修改吗?如果添加键时总是不同,它不应该是线程安全的,因为它修改了内存的独立部分?
感谢 希夫
这是关于线程安全的std::map
。现在,同时读取是线程安全的,但写入不是。我的问题是,如果我每次向地图添加独特的元素,是否会线程安全?C++映射的线程安全
所以,举例来说,如果我有一张地图这样std:map<int, std::string> myMap
,我总是添加新键,从来没有修改现有的键值,那将是线程安全的?
更重要的是,这会给我任何随机的运行时行为吗?
添加新密钥也被认为是修改吗?如果添加键时总是不同,它不应该是线程安全的,因为它修改了内存的独立部分?
感谢 希夫
1)当然不是
2)是的,我希望在测试过程中,你会遇到它,而不是后来
3)是的,它是。新元素被添加到不同的位置,但许多指针在此期间被修改。
在大多数情况下,如果不是所有的实现,该映射都是通过某种树实现的。在树中插入一个新元素,通过重新设置指向不同节点的指针重新排列节点来修改它。所以它不是线程安全的
+1,正好.... –
@armen什么是最好的选择呢? –
@EdwinVivekN:在同时使用STL容器时,您需要使用外部同步机制(例如互斥锁) –
不,是的,是的。在修改容器(包括插入新密钥)时,您需要获得独占锁定,尽管当前没有修改,当然可以同时安全读取。
编辑:http://www.sgi.com/tech/stl/thread_safety.html可能是你感兴趣的。
不,这不会是线程安全的,因为两个线程可以一次添加两个(唯一的)项目,它们将在同一个地方。 –
你可以从标准容器中得到的唯一线程安全性是,如果容器永远不会被修改,并且每个线程访问(读取或写入)一个**不同的**元素,那应该没问题。 –