我有一个std::unordered_map
,它承受来自多个线程的非常繁重的工作负载。我可以使用std::mutex
进行同步,但由于并发读取应该没问题,我想改用boost::shared_mutex
。为了测试性能改进,我首先使用一堆值预先填充一个映射,然后让一堆线程运行read test:
for (int i = 0; i < iters; ++i) map.count(random_uint(0, key_max));
我为count
std::lock_guard<std::mutex>
受boost::shared_lock<boost::shared_mutex>
保护boost::shared_lock
以及受boost::shared_lock
保护的coarse-lock implementation执行此操作。
在我的带有GCC 6.1.1的Arch Linux x86_64系统上,shared_lock
版本总是更慢!在我朋友的Windows 10系统上使用MSVC 2013,{{1 总是更快!
完整的可编译代码位于github:shared-lock implementation
这似乎是一个特定于平台的问题。往上看。我真的很感激,如果其他人可以构建并运行此代码并报告他们是否看到正输出({{1}}更快)或负面(当前互斥更快)以及您正在使用的平台。
答案 0 :(得分:7)
事实证明,boost::shared_mutex
在Linux上是"suboptimal"。
对于'pthread',boost :: shared_mutex的当前(作为boost 1.59)实现是非常不理想的,因为它使用重量级互斥锁来保护内部互斥锁状态... [当访问并发性很高时]共享互斥锁是有效地排他性。
万岁以获得提升以及我生命中的许多小时它已被盗。
答案 1 :(得分:-2)
很少注意到:
如果您的数据结构遭遇高争用,强烈建议使用具有无锁实施的相同数据结构
Reader-Writer锁通常会在读取很常见时提高性能,但写入很少。从哲学上讲,如果锁定必须确定其他线程是否在读取模式或写入模式下捕获了锁定,则它比单纯等待锁定释放要慢。因此,如果读取很常见且写入很少,则其他线程不会被阻止。 如果写操作很常见,不仅线程被阻塞,而且还必须执行额外的逻辑来确定如何锁定线程。
因此,对于夏季来说,您的示例会以错误的方式使用锁定。此外,如果性能能够让您满意,请使用无锁编程。