当共享访问极其罕见时,在 Windows 中使用 c++11 锁定资源的最有效方法?

问题描述 投票:0回答:1

我有一个 C++ 类,其中包含规则列表。一个函数添加/删除此类的规则,另一个函数根据规则进行一些检查(例如,将 PID 作为输入,并根据规则返回决策)

所以我需要确保在删除/添加规则时没有进行任何检查。但是添加和删除规则的情况非常罕见,所以我进行检查的时候 99.9% 都不需要进行锁定,因为没有人会删除/添加规则。

我的问题是,确保在添加或删除规则时不进行任何检查,但同时确保检查速度不会减慢的最佳方法是什么?

我想过只使用 std::mutex 并完成它,但是在进行检查时我必须保持锁定,即使 99.9% 的情况下都不需要锁定,这不会减慢速度吗很多?

我也考虑过使用临界区,但基于一些堆栈溢出线程,临界区甚至比 Windows 8.1+ 中的 std::mutex 还要慢。

我也可以使用 WinAPI 来解决这个问题。

c++ windows c++11 winapi
1个回答
0
投票

既然您“可以使用 WinAPI 来解决此问题”,请考虑使用 Slim Reader/Writer Lock (Windows Vista+):

超薄读写器(SRW)锁使单个进程的线程能够访问共享资源; 它们针对速度进行了优化并且占用很少的内存。 Slim 读写锁无法跨进程共享。

读取器线程从共享资源读取数据,而写入器线程将数据写入共享资源。当多个线程使用共享资源进行读写时,如果读取线程连续运行但写入操作很少,则临界区或互斥锁等独占锁可能会成为瓶颈。 SRW锁提供了两种线程访问共享资源的模式:

    共享模式,
  • 向多个读取器线程授予共享只读访问权限

    ,使它们能够同时从共享资源中读取数据。如果读取操作超过写入操作,与关键部分相比,这种并发性会提高性能和吞吐量。

  • 独占模式,
  • 一次向一个写入器线程授予读/写访问权限

    。当以独占模式获取锁时,在写入者释放锁之前,其他线程无法访问共享资源。

当你检查规则时,获取读锁,这是非常高效的,并且确保没有其他线程拥有写锁。多个线程可以同时共享读者锁,进行并发只读访问。

当您更改规则时,获取写入器锁,这确保没有其他线程拥有读取器锁。一次只有 1 个线程可以拥有写入者锁以进行独占读/写访问。

© www.soinside.com 2019 - 2024. All rights reserved.