Gre*_*ire 9 c++ unordered-map thread-safety c++11
这是场景:
1)使用一个unordered_map<int, vector<MyClass*>*>让我们说我添加键1,2,... 8
2)所有键都在程序初始化时设置了向量,并且没有添加或删除
3)我有8个线程,其中thread1访问键[1] ,thread2访问键[2],... thread8访问键[8](即线程号只能访问该键号而不能访问其他键)
有时我会将值向量*重新分配给另一个堆分配的集合.(即thread1执行key[1] = new vector<MyClass*>)
我相信这将是线程安全的,我是否正确?如果没有,我想我会使用concurrent_unordered_map.
谢谢.
Man*_*rse 11
这个问题的答案可以在以下网址找到[res.on.data.races]/3:
C++标准库函数不应直接或间接修改除当前线程以外的线程可访问的对象(1.10),除非通过函数的非const参数直接或间接访问对象,包括此参数.
此外,[container.requirements.dataraces]/1州:
为了避免数据争用(目的
[res.on.data.races]),实现方式应考虑以下功能为const:begin,end,rbegin,rend,front,back,data,find,lower_bound,upper_bound,equal_range,at和,除了在缔合或无序关联式容器,operator[].
由于unordered_map :: operator []是非const的,因此实现修改发生unordered_map调用的时间是合法的operator[].您应该使用unordered_map :: find,这显然需要被视为const,因此不会修改unordered_map:
map.find(key)->second = new vector<MyClass*>;
Run Code Online (Sandbox Code Playgroud)
(作为旁注,你建议的设计看起来像是内存泄漏的秘诀.为什么不把它变成a unordered_map<int, std::unique_ptr<vector<MyClass*>>>,或unordered_map<int,vector<MyClass*>>?)