我正在使用boost:thread库将单线程程序更改为多线程。该程序将unordered_map用作hasp_map进行查找。我的问题是..
一次将有多个线程在写,而在另一时间将有多个线程在读,但不是同时在读和写,即所有线程将在读或全部在写。那将是线程安全的,并且为此设计了容器吗?如果可以的话,它真的会同时存在并提高性能吗?我需要使用一些锁定机制吗?
我在某处读到C ++标准说该行为是不确定的,但仅此而已吗?
更新:我也正在考虑英特尔并发_哈希表。那会是个好选择吗?
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指定了一些其他的非常量操作,这些操作在不同的线程上是安全的。
@ EthanSteinberg- std :: mutex?还是boost:mutex?
@questions他们都是一样的。与std :: mutex相比,Boost :: mutex可能更易于使用,因为更多的编译器支持它。
@EthanSteinberg-我不需要锁定读者,对吗?因为多个线程可以同时读取。
您是否有主张的消息来源:确保多个线程能够同时读取?
澄清一下我无法同时从一个线程读取和写入另一个线程?