我正在使用boost:线程库将单线程程序更改为多线程。该程序使用unordered_map作为查找的hasp_map。我的问题是..
在某一时刻,许多线程都在写入,而在另一时刻,许多线程都在读取,但不是同时读取和写入,也就是说,要么所有线程都在读取,要么所有线程都在写入。这是线程安全的吗?容器是为此而设计的吗?如果是这样的话,它真的是并发的并提高性能吗?我需要使用某种锁定机制吗?
我在某处读到C++标准说行为将是未定义的,但这就是全部吗?
更新:我也在考虑英特尔concurrent_hash_map。这是一个好的选择吗?
发布于 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指定了一些额外的非常量操作,这些操作在不同的线程上是安全的。
发布于 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。
要点:
”
发布于 2012-03-13 22:08:30
这是线程安全的吗?容器是为此而设计的吗?
不,标准容器不是线程安全的。
我需要使用某种锁定机制吗?
不,你需要。既然您使用的是boost,那么boost::mutex将是一个好主意;在C++11中,可以使用std::mutex。
我在某处读到C++标准说行为将是未定义的,但这就是全部吗?
事实上,这种行为是不确定的。我不确定你所说的“这就是全部吗?”是什么意思,因为未定义的行为是最糟糕的一种行为,而且根据定义,一个表现出这种行为的程序是不正确的。特别是,不正确的线程同步可能会导致随机崩溃和数据损坏,通常是以非常难以诊断的方式,因此您最好不惜一切代价避免这种情况。
英特尔更新:我也在考虑
concurrent_hash_map。这是一个好的选择吗?
这听起来不错,但我自己从来没有用过它,所以我不能给出意见。
https://stackoverflow.com/questions/9685486
复制相似问题