unordered_map线程安全

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操作.

  • 您是否有索赔来源:保证多个线程能够同时读取? (3认同)
  • 澄清我不能从一个线程读取并同时从另一个线程写入? (3认同)

小智 15

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

要点:

  • “同一个容器中的不同元素可以被不同的线程同时修改”
  • "所有const成员函数都可以被同一个容器上的不同线程并发调用。另外,成员函数begin()、end()、rbegin()、rend()、front()、back()、data() 、 find()、lower_bound()、upper_bound()、equal_range()、at() 以及,除了在关联容器中,operator[] 出于线程安全的目的表现为 const(也就是说,它们也可以被称为由同一容器上的不同线程同时执行)。”


Mik*_*our 8

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

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

我需要使用一些锁定机制吗?

是的你是.既然你正在使用助推器,那boost::mutex将是一个好主意; 在C++ 11中,有std::mutex.

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

实际上,这种行为是不确定的.我不确定你的意思是"是全部吗?",因为未定义的行为是最糟糕的行为,而展示它的程序根据定义是不正确的.特别是,不正确的线程同步可能会导致随机崩溃和数据损坏,通常以非常难以诊断的方式进行,因此您不惜一切代价避免它.

更新:我还在考虑英特尔concurrent_hash_map.这是一个不错的选择吗?

这听起来不错,但我自己从未使用它,所以我无法提供意见.