que*_*ons 22 c++ multithreading boost hashmap thread-safety
我正在使用boost:thread库将单个线程程序更改为多线程.该程序使用unordered_map作为hasp_map进行查找.我的问题是......
有一次,很多线程都会写入,而另一些线程会读取,但不会同时读取和写入,即所有线程都将读取或者所有线程都将写入.这是线程安全的和为此设计的容器吗?如果它会,它真的会并发并提高性能吗?我需要使用一些锁定机制吗?
我在某处读到C++标准说行为将是未定义的,但这就是全部吗?
更新:我还在考虑英特尔concurrent_hash_map.这是一个不错的选择吗?
Lal*_*and 48
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指定了一些在不同线程上安全的其他非const操作.
小智 15
std::unordered_map 满足容器的要求(参考http://en.cppreference.com/w/cpp/container/unordered_map)。有关容器线程安全,请参阅:http : //en.cppreference.com/w/cpp/container#Thread_safety。
要点:
这是线程安全的和为此设计的容器吗?
不,标准容器不是线程安全的.
我需要使用一些锁定机制吗?
是的你是.既然你正在使用助推器,那boost::mutex将是一个好主意; 在C++ 11中,有std::mutex.
我在某处读到C++标准说行为将是未定义的,但这就是全部吗?
实际上,这种行为是不确定的.我不确定你的意思是"是全部吗?",因为未定义的行为是最糟糕的行为,而展示它的程序根据定义是不正确的.特别是,不正确的线程同步可能会导致随机崩溃和数据损坏,通常以非常难以诊断的方式进行,因此您不惜一切代价避免它.
更新:我还在考虑英特尔concurrent_hash_map.这是一个不错的选择吗?
这听起来不错,但我自己从未使用它,所以我无法提供意见.