C++17提供了两种新的互斥:

lock_guard<std::shared_mutex> 、lock_guard<std::shared_time_mutex>它们与mutex一样都保证了访问的排他性.

共享锁仅有一个限制:假设它已经被某些线程持有,若别的线程视图获取排他锁,就会发生阻塞,直到那些线程全部释放该共享锁。

下面是个demo:

class dns_entry;
class dns_cache {
    std::map<std::string, dns_entry> entries;
    mutable std::shared_mutex entry_mtx;
public:
    dns_entry find_entry(std::string const& domain) const
    {
        std::shared_lock<std::shared_mutex> lk(entry_mtx);
        auto iter = entries.find(domain);
        return (iter == entries.end()) ? dns_entry() : iter->second;
    }
    
    void update_or_add_entry(std::string const& domain, dns_entry const& dns_details) {
        std::lock_guard<std::shared_mutex> lk(entry_mtx);
        entries[domain] = dns_details;
    }
};

当缓存表需要更新时,update_or_add_entry()采用std::lock_guard<>实例进行排他访问。