采用C++17新标准 “共享锁”和“独占锁”更低消耗更好性能地保护不常更新的共享数据
用到的标准库:
std::shared_lock<>、 std::shared_mutex、 std::lock_guard<>。 另外还有 std::shared_timed_mutex(此处不讲)。
分析:对于保护不常更新的共享数据, 因为写只是很偶然的发生,更频繁的是读取。如果不区分 “读者” 和 “作者” ,简单的使用 std::mutex, 会有很多消耗的浪费。 例如,DNS域名解析服务, 当没有新的设备接入时,入口表可能一个星期检查,并细微的更新一次。 这种情况就非常适合我们即将讲到的情况。
C++17 提供的 “共享锁” 和 “独占锁” 机制, 当多个读者到来时,它们可同时获取共享锁进行读取; 当某个写着到来时, 先获取共享锁,然后等待当前已存在的读者读取结束, 之后进一步获取独占锁进行写入。要注意的是, 在写着 “等待” 当前读者读取结束这个环节,另外的读取或者写入将不能获取共享锁, 直到当前的写着结束写之后,其它的写着,或者读者,才能进行锁的获取。
有几个要注意的点:
1. C++17标准
2. 对于读者获取共享锁的方式:
std::shared_lock<std::shared_mutex> shlk( mtx);
3. 对于写着获取独占锁的方式:
std::lock_guard<std::shared_mutex> lkgd( mtx );