- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
对 std::map 中对象的引用是线程安全的吗?
std::map< std::string, Object > _objects;
map 可以从许多线程中更改,并且此访问是同步的,但对值 (Object &) 的引用只能从 1 个实例和线程访问。如果另一个线程将项目添加到 map ,使用 Object & 进行写操作是否安全?会重新分配吗?
最佳答案
C++11 标准保证 const
方法对容器的访问对于不同线程是安全的(即,两者都使用 const
方法)。
此外,[container.requirements.dataraces] 状态
implementations are required to avoid data races when the contents of the contained object in different elements in the same sequence, excepting
vector<bool>
换句话说,除了 vector<bool>
修改不同的内容不是数据竞争。
现在,如果一个线程使另一个线程使用的迭代器无效,显然这是一场数据竞争(并导致未定义的行为)。如果一个线程对容器进行非 const
访问,而另一个线程进行 const
访问,这就是数据竞争(和未定义的行为)。 (注意:出于多线程的目的,许多函数被“视为 const
”,包括 begin
、 end
和其他非 const
的函数(和方法),因为它们返回非 const
迭代器。[]
包含在这组出于线程安全原因,伪 const
,除了 map
和 unordered_set
等 - 23.2.2.1)。
但是,如果您对容器中的某个元素有引用,并且在另一个线程中执行不会使该引用无效的操作,并且从未在另一个线程中写入该元素,则您可以安全地从中读取引用。同样,如果其他线程甚至从未读取过该元素,那么写入该元素不应导致未定义的行为。
对于标准引用,17.6.5.9.5 似乎保证标准库中的函数不会跑掉并不必要地读/写元素。
所以简短的回答:你是安全的,只要其他线程不直接与 map
中的特定条目混淆。
关于c++ - std::map 线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15067160/
我是一名优秀的程序员,十分优秀!