unordered_map find()和运算符[]

unordered_map find() and operator []

本文关键字:运算符 map find unordered      更新时间:2023-10-16

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

线程1执行以下操作:

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

线程2执行以下操作:

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

Time1发生在Time2之前,假设在thread2中,get!=themap.end()将是正确的,并且得到->second=100!!!让我困扰的是,如果在Time2的那一刻,thread1正在执行themap["user2"]=101,这将修改该地图的内存结构,thread2 themap.find在同一时间查找thread1修改该地图中的内存内容,如果没有锁,我仍然可以得到!=映射结束()?得到->秒=100?

themap["user2"]=101并且get=themap.fund(s)
在同一时间做会导致获得->秒不到100?

对于一个线程的写入和多个线程的读取来说,unrdered_map线程安全是正确的。

同样在Time1的例子中,您正在修改"user1",然后在Time2的线程2中搜索它。事实上,您在时间2时在线程1中设置"user2"是正交的。

关于正在修改的内部内存,这不是问题,因为插入新值时find启动的迭代器不会无效。

因此,在您的测试用例中不存在竞赛条件。

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