9

这是场景:

1)使用unordered_map<int, vector<MyClass*>*>假设我添加键 1、2、... 8
2)所有键在程序初始化时都用向量设置,没有更多的添加或删除
3)我有 8 个线程,其中 thread1 访问键 [1] , thread2 访问 key[2], ... thread8 访问 key[8] (即线程号只能访问该密钥号而不能访问其他密钥)

有时我将值向量 * 重新分配给另一个堆分配的集合。(即thread1执行key[1] = new vector<MyClass*>

我相信这将是线程安全的,对吗?如果没有,我想我会使用 concurrent_unordered_map。

谢谢。

4

1 回答 1

11

这个问题的答案可以在以下位置找到[res.on.data.races]/3

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

此外,[container.requirements.dataraces]/1指出:

为了避免数据竞争(),实现[res.on.data.races]应考虑以下函数const:_ _ _beginendrbeginrendfrontbackdatafindlower_boundupper_boundequal_rangeatoperator[]

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

map.find(key)->second = new vector<MyClass*>;

(作为旁注,您建议的设计看起来像是内存泄漏的秘诀。为什么不将其设为unordered_map<int, std::unique_ptr<vector<MyClass*>>>, 或unordered_map<int,vector<MyClass*>>?)

于 2012-10-30T03:29:48.230 回答