首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >unordered_map线程安全性

问unordered_map线程安全性
EN

Stack Overflow用户
提问于 2012-03-13 21:59:23
回答 7查看 43.9K关注 0票数 38

我正在使用boost:线程库将单线程程序更改为多线程。该程序使用unordered_map作为查找的hasp_map。我的问题是..

在某一时刻,许多线程都在写入,而在另一时刻,许多线程都在读取,但不是同时读取和写入,也就是说,要么所有线程都在读取,要么所有线程都在写入。这是线程安全的吗?容器是为此而设计的吗?如果是这样的话,它真的是并发的并提高性能吗?我需要使用某种锁定机制吗?

我在某处读到C++标准说行为将是未定义的,但这就是全部吗?

更新:我也在考虑英特尔concurrent_hash_map。这是一个好的选择吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-03-13 22:05:47

STL容器的设计使您能够保证:

A.多线程同时读取

或

B.一个线程同时写入

多线程写入不是上述条件之一,也是不允许的。因此,多线程写入将造成数据竞争,这是未定义的行为。

您可以使用互斥锁来修复此问题。shared_mutex (与shared_locks结合使用)将特别有用,因为该类型的互斥锁允许多个并发读取器。

http://eel.is/c++draft/res.on.data.races#3是标准的一部分,它保证了在不同线程上同时使用const函数的能力。http://eel.is/c++draft/container.requirements.dataraces指定了一些额外的非常量操作,这些操作在不同的线程上是安全的。

票数 65
EN

Stack Overflow用户

发布于 2017-01-30 23:31:12

std::unordered_map符合集装箱(参考http://en.cppreference.com/w/cpp/container/unordered_map)的要求。有关容器线程的安全性,请参阅:http://en.cppreference.com/w/cpp/container#Thread_safety。

要点:

  • “同一容器中的不同元素可以被不同的线程并发修改”
  • “所有常量成员函数都可以被同一容器中的不同线程并发调用。此外,成员函数begin(),end(),rbegin(),rend(),for (),back(),data(),find(),lower_bound(),upper_bound(),equal_range(),at(),以及,除了在关联容器中,operator[],出于线程安全的目的,表现为常量(即,它们也可以被同一容器上的不同线程并发调用)。“

”

票数 16
EN

Stack Overflow用户

发布于 2012-03-13 22:08:30

这是线程安全的吗?容器是为此而设计的吗?

不,标准容器不是线程安全的。

我需要使用某种锁定机制吗?

不,你需要。既然您使用的是boost,那么boost::mutex将是一个好主意;在C++11中,可以使用std::mutex。

我在某处读到C++标准说行为将是未定义的,但这就是全部吗?

事实上,这种行为是不确定的。我不确定你所说的“这就是全部吗?”是什么意思,因为未定义的行为是最糟糕的一种行为,而且根据定义,一个表现出这种行为的程序是不正确的。特别是,不正确的线程同步可能会导致随机崩溃和数据损坏,通常是以非常难以诊断的方式,因此您最好不惜一切代价避免这种情况。

英特尔更新:我也在考虑

concurrent_hash_map。这是一个好的选择吗?

这听起来不错,但我自己从来没有用过它,所以我不能给出意见。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9685486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档