建自己的个人网站,wordpress图片768好吗,免费的好网站,办公室装修设计连锁共享锁和排它锁—C17 多线程
读写锁把对共享资源的访问者划分成读者和写者#xff0c;读者只对共享资源进行读访问#xff0c;写者则需要对共享资源进行写操作。C17开始#xff0c;标准库提供了shared_mutex类#xff08;在这之前#xff0c;可以使用boost的shared_mutex…共享锁和排它锁—C17 多线程
读写锁把对共享资源的访问者划分成读者和写者读者只对共享资源进行读访问写者则需要对共享资源进行写操作。C17开始标准库提供了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_mutexusing namespace std;class DnsEntry
{
private:std::string ip;
public:DnsEntry(){}DnsEntry(std::string _ip): ip(_ip){}
};class DnsCatch
{
private:std::mapstd::string, DnsEntry entries;mutable std::shared_mutex entry_mutex;
public:// 多个线程可以同时调用DnsEntry find_entry(std::string const domain) const{std::shared_lockstd::shared_mutex lk(entry_mutex);std::cout 读取\n;std::mapstd::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_lockstd::shared_mutex lk(entry_mutex);std::cout 更新\n;entries[domain] dns_details;}
}; 参考《C并发编程实战第2版》