我有一个 C++ 类,其中包含规则列表。一个函数添加/删除此类的规则,另一个函数根据规则进行一些检查(例如,将 PID 作为输入,并根据规则返回决策)
所以我需要确保在删除/添加规则时没有进行任何检查。但是添加和删除规则的情况非常罕见,所以我进行检查的时候 99.9% 都不需要进行锁定,因为没有人会删除/添加规则。
我的问题是,确保在添加或删除规则时不进行任何检查,但同时确保检查速度不会减慢的最佳方法是什么?
我想过只使用 std::mutex 并完成它,但是在进行检查时我必须保持锁定,即使 99.9% 的情况下都不需要锁定,这不会减慢速度吗很多?
我也考虑过使用临界区,但基于一些堆栈溢出线程,临界区甚至比 Windows 8.1+ 中的 std::mutex 还要慢。
我也可以使用 WinAPI 来解决这个问题。
既然您“可以使用 WinAPI 来解决此问题”,请考虑使用 Slim Reader/Writer Lock (Windows Vista+):
超薄读写器(SRW)锁使单个进程的线程能够访问共享资源; 它们针对速度进行了优化并且占用很少的内存。 Slim 读写锁无法跨进程共享。
读取器线程从共享资源读取数据,而写入器线程将数据写入共享资源。当多个线程使用共享资源进行读写时,如果读取线程连续运行但写入操作很少,则临界区或互斥锁等独占锁可能会成为瓶颈。 SRW锁提供了两种线程访问共享资源的模式:
共享模式,
当你检查规则时,获取读锁,这是非常高效的,并且确保没有其他线程拥有写锁。多个线程可以同时共享读者锁,进行并发只读访问。- 向多个读取器线程授予共享只读访问权限
独占模式,,使它们能够同时从共享资源中读取数据。如果读取操作超过写入操作,与关键部分相比,这种并发性会提高性能和吞吐量。
- 一次向一个写入器线程授予读/写访问权限
。当以独占模式获取锁时,在写入者释放锁之前,其他线程无法访问共享资源。
当您更改规则时,获取写入器锁,这确保没有其他线程拥有读取器锁。一次只有 1 个线程可以拥有写入者锁以进行独占读/写访问。