共享锁和排它锁—C++17 多线程
读写锁把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。C++17开始,标准库提供了shared_mutex
类(在这之前,可以使用boost
的shared_mutex
类或系统相关api)。和其他便于独占访问的互斥类型不同,shared_mutex
拥有两个访问级别:
- 共享:多个线程能共享同一互斥的所有权(如配合shared_lock);
- 独占:仅有一个线程能占有互斥(如配合lock_guard、unique_lock)。
shared_mutex
适用于多线程同时读取是不发生竞争,写入时发出竞争
#include <iostream>
#include <thread>
#include <map>
#include <mutex>
#include <shared_mutex>using namespace std;class DnsEntry
{
private:std::string ip;
public:DnsEntry(){}DnsEntry(std::string _ip): ip(_ip){}
};class DnsCatch
{
private:std::map<std::string, DnsEntry> entries;mutable std::shared_mutex entry_mutex;
public:// 多个线程可以同时调用DnsEntry find_entry(std::string const& domain) const{std::shared_lock<std::shared_mutex> lk(entry_mutex);std::cout << "读取\n";std::map<std::string, DnsEntry>::const_iterator const it = entries.find(domain);return (it == entries.end()) ? DnsEntry() : it->second;}// 只有一个线程可以调用void update_or_add_entry(std::string const& domain, DnsEntry const& dns_details){std::unique_lock<std::shared_mutex> lk(entry_mutex);std::cout << "更新\n";entries[domain] = dns_details;}
};
参考《C++并发编程实战(第2版)》