我有一个全局var std :: unordered_map themap。

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时刻,线程1正在执行themap [“ user2”] = 101,这将修改该地图的内存结构,线程2 themap.find恰好在同一时间查找线程1修改了地图的内存内容,如果没有锁,我仍然得到
有!= themap.end()吗?并得到-> second = 100?

themap [“ user2”] = 101,得到= themap.find(s)
在同一时间做会导致得到->秒不等于100吗?

最佳答案

的确,unordered_map thread safe只能写一个线程,读多个线程。

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

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

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

08-24 21:54