unordered_map 查找 () 和运算符 []

unordered_map find() and operator []

我有一个全局变量 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 中, got != themap.end() 将是正确的并且 got->second = 100 !!!令我困扰的是,如果在 Time2 的那一刻,thread1 正在执行 themap["user2"] = 101,这将修改 themap 的内存结构,thread2 themap.find 在同一时间执行 find thread1 修改 themap 的内存内容,如果没有锁,我仍然得到 得到 != themap.end() 了吗?得到->second = 100 ?

themap["user2"] = 101 得到 = themap.find( s )
同时做会导致 got->second not to 100 ?

您可以阻止 unorderd_map 更改其内部结构,方法是事先强制它这样做。使用reserve,并将max_load_factor设为或接近1.0f

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

此外,在时间 1 的示例中,您正在修改 "user1" ,然后在时间 2 的线程 2 中搜索它。您在时间 2 的线程 1 中设置 "user2" 的事实是正交的.

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

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