0
点赞
收藏
分享

微信扫一扫

共享锁和排它锁---C++17 多线程


共享锁和排它锁—C++17 多线程

读写锁把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。C++17开始,标准库提供了shared_mutex类(在这之前,可以使用boostshared_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版)


举报

相关推荐

0 条评论