C++读写锁-实现优先写

// 读写互斥量
// 当有写和读操作同时竞争时,写操作优先与读操作
class CRWMutex
{
public:
	CRWMutex()
		: m_read_count_(0)
		, m_write_count_(0)
		, m_is_writing_(false)
	{
	}

	virtual ~CRWMutex() = default;

	void LockRead()
	{
		std::unique_lock<std::mutex> locker(m_mutex_);
		m_read_cond_.wait(locker, [=]{return 0 == m_write_count_; }); // 没有写等待时,可执行读
		++m_read_count_;
	}

	void UnLockRead()
	{
		std::unique_lock<std::mutex> locker(m_mutex_);
		if (0 == --m_read_count_ && 0 != m_write_count_) // 当读操作减为0,并且有等待的写操作时,通知一个线程写
		{
			m_write_cond.notify_one();
		}
	}

	void LockWrite()
	{
		std::unique_lock<std::mutex> locker(m_mutex_);
		++m_write_count_;																//写先进行计数统计,这里可以实现写优先于读
		m_write_cond.wait(locker, [=]{return 0 == m_read_count_ && !m_is_writing_; });	// 没有读操作并且没有正在写时,可执行写
		m_is_writing_ = true;
	}

	void UnLockWrite()
	{
		std::unique_lock<std::mutex> locker(m_mutex_);
		if (0 == --m_write_count_)
		{
			m_read_cond_.notify_all();		// 没有写操作等待时,通知所有读
		}else
		{
			m_write_cond.notify_one();		// 还有写操作等待时,通知一个线程写
		}
		m_is_writing_ = false;
	}

private:
	std::mutex m_mutex_;
	volatile int m_read_count_;				// 读操作持有者计数
	volatile int m_write_count_;			// 写操作持有者计数
	bool m_is_writing_;						// 是否正在写
	std::condition_variable m_read_cond_;	// 可读条件变量
	std::condition_variable m_write_cond;	// 可写条件变量
};

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值