unordered_map find()和operator []

时间:2015-10-27 23:53:40

标签: c++ c++11 thread-safety g++ unordered-map

我有一个全局var std :: unordered_map< std :: string,int>地图。

thread1执行以下操作:

Time1 : 
string s = "user1" ; 
themap[s] = 100 ;

Time2 :
string s = "user2" ;
themap[s] = 101 ;

thread2执行以下操作:

Time2:
string s = "user1" ;
auto got = themap.find( s ) ;

Time1发生在Time2之前,假设在thread2中,得到了!= themap.end()将是正确的并且得到了> second = 100 !!!困扰我的是,如果在Time2的当下,thread1正在做地图[" user2"] = 101,这将修改地图的内存结构,thread2 themap.find正在做的确切查找同时thread1修改了map的内存内容,如果没有锁定,我仍然可以 得到了!= themap.end()?并得到 - >第二= 100?

地图[" user2"] = 101并获得= themap.find(s)
在完全相同的时间做会导致得到 - >第二次不到100?

2 个答案:

答案 0 :(得分:0)

您可以通过强制事先强制执行此操作来阻止unorderd_map更改其内部结构。使用reserve,并将max_load_factor设置为或接近1.0f

答案 1 :(得分:0)

确实unordered_map thread safe适用于一个线程写入,多个线程读取。

同样在时间1的示例中,您正在修改“user1”,然后在时间2在线程2中搜索。在时间2处在线程1中设置“user2”的事实是正交的。

关于要修改的内部内存,这不是问题,因为在您插入新值will not be invalidated时,find使用的迭代器已启动。

因此,在您的测试用例中没有竞争条件。