这是场景:
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。
感谢。
答案 0 :(得分:11)
这个问题的答案可以在[res.on.data.races]/3
:
C ++标准库函数不应直接或间接修改除当前线程以外的线程可访问的对象(1.10),除非通过函数的非const参数直接或间接访问对象,包括此参数。
此外,[container.requirements.dataraces]/1
声明:
为避免数据争用(
[res.on.data.races]
),实现应将以下函数视为const
:begin
,end
,rbegin
,{ {1}},rend
,front
,back
,data
,find
,lower_bound
,upper_bound
,{{1除了在关联或无序的关联容器中,equal_range
。
由于unordered_map::operator[]是非const,因此在调用at
时修改operator[]
的实现是合法的。您应该使用unordered_map::find,明确要求将其视为unordered_map
,因此不会修改operator[]
:
const
(作为旁注,您的建议设计看起来像是内存泄漏的秘诀。为什么不将其设为unordered_map
或map.find(key)->second = new vector<MyClass*>;
?)