unordered_map find()和运算符[]
unordered_map find() and operator []
我有一个全局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
。
相关文章:
- 使用重载 [] 运算符返回 std::map() 的可赋值
- 使用 at() 访问 std::map 元素是否比运算符 [] 慢?
- 如果键不存在,使用 [] 运算符访问 STL Map 元素会添加新元素
- std::map 索引运算符与插入方法的性能
- 如何在 std::map<const int、int> C++ 中重载插入运算符>>?
- 为什么我不能重载运算符<< 与 ostream 和 map( 或 unordered_map)?
- 在 std::map 上使用三元运算符和 std::更大的附加参数
- std::map<int, A> 运算符 [] 需要使用空构造函数创建 A
- STL std::map 运算符 [] 在赋值的右侧
- 将强制转换运算符重载到 std::map 的正确语法是什么
- 使用带有下标运算符的赋值运算符将值分配给 std::map
- std::map :使用自定义运算符时更新密钥
- 是否可以为带有 std:string 和 std::vector 的 std::map 重载<<运算符<int>?
- C++ - (零成本?) 代理类运算符=(值) -> std::map[key]=类内的值
- map/fold运算符(在c++中)
- std::map:使用键类以外的参数重载运算符<
- std::map 插入错误:没有运算符"<"与这些操作数匹配
- std::map 是否要求比较器的运算符 () 是 const?
- 如何在map中放置具有"deleted"复制ctor和赋值运算符的类?
- 交换与使用std::map[]运算符赋值(const问题)