C ++ stl unordered_map,线程安全,其中每个线程只访问它自己分配的密钥,并可以编辑该值

时间:2012-10-30 03:08:11

标签: c++ c++11 thread-safety unordered-map

这是场景:

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。

感谢。

1 个答案:

答案 0 :(得分:11)

这个问题的答案可以在[res.on.data.races]/3

中找到
  

C ++标准库函数不应直接或间接修改除当前线程以外的线程可访问的对象(1.10),除非通过函数的非const参数直接或间接访问对象,包括此参数。

此外,[container.requirements.dataraces]/1声明:

  

为避免数据争用([res.on.data.races]),实现应将以下函数视为constbeginendrbegin,{ {1}},rendfrontbackdatafindlower_boundupper_bound,{{1除了在关联或无序的关联容器中,equal_range

由于unordered_map::operator[]是非const,因此在调用at时修改operator[]的实现是合法的。您应该使用unordered_map::find,明确要求将其视为unordered_map,因此不会修改operator[]

const

(作为旁注,您的建议设计看起来像是内存泄漏的秘诀。为什么不将其设为unordered_mapmap.find(key)->second = new vector<MyClass*>; ?)