我有一个全局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?
答案 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使用的迭代器已启动。
因此,在您的测试用例中没有竞争条件。