温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c++ - unordered_map thread safety
boost c++ hashmap multithreading thread-safety

c++ - unordered_map线程安全

发布于 2020-05-25 12:02:05

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

一次将有多个线程在写,而在另一时间将有多个线程在读,但不是同时在读和写,即所有线程将在读或全部在写。那将是线程安全的,并且为此设计了容器吗?如果可以的话,它真的会同时存在并提高性能吗?我需要使用一些锁定机制吗?

我在某处读到C ++标准说该行为是不确定的,但仅此而已吗?

更新:我也正在考虑英特尔并发_哈希表。那会是个好选择吗?

查看更多

提问者
questions
被浏览
11
Lalaland 2018-03-23 23:58

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指定了一些其他的非常量操作,这些操作在不同的线程上是安全的。