c++ 自旋锁、读写锁和可打断锁

自旋锁

// 自旋锁: 一种非阻塞同步机制,它通过原子操作来获取锁,如果锁已经被其他线程持有,则自旋等待直到锁可用。
// 适用场景: 保护短暂代码块,在等待锁的时间非常短的情况下,自旋锁可以提供更好的性能。
#ifndef _ZD_SPINLOCK_H_
#define _ZD_SPINLOCK_H_

#if defined(_MSC_VER) && _MSC_VER>1000
#pragma once
#endif

#include <atomic>

class ZDSpinLock
{
public:
	ZDSpinLock() 
		: m_lock(ATOMIC_VAR_INIT(false))
	{
	}

    virtual ~ZDSpinLock() = default;

    void Lock() 
    {
        // exchange函数作用:读m_lock,修改m_lcok为true,此过程为原子操作
        while (m_lock.exchange(true, std::memory_order_acquire)) 
        {
            // 锁被占用,自旋等待直至锁释放
        }
    }

    void UnLock() 
    {
        // store函数作用:修改m_lock为false,此过程为原子操作
        m_lock.store(false, std::memory_order_release);
    }

private:
	std::atomic_bool m_lock;
};

#endif

读写锁

// 使用互斥锁和条件变量实现读写锁
#ifndef _ZD_RWLOCK_H_
#define _ZD_RWLOCK_H_

#if defined(_MSC_VER) && _MSC_VER>1000
#pragma once
#endif

#include <mutex>
#include <condition_variable>

class ZDRWLock
{
public:
	ZDRWLock()
		: m_count_(0) 
		, m_writing_(false)
	{
	}

	virtual ~ZDRWLock() = default;

	void LockRead()
	{
		std::unique_lock<std::mutex> lock(m_mtx_);
		while (m_writing_)
		{
			m_cond_.wait(lock); // 有线程在写,阻塞读线程,注意:写优先级高于读
		}
		m_count_++;             // m_count >= 0, 允许多线程读
	}

	void UnLockRead()
	{
		std::unique_lock<std::mutex> lock(m_mtx_);
		m_count_--;
		if (0 == m_count_)        // 所有线程读完
		{
			m_cond_.notify_one(); // 唤醒一个读或写线程
		}
	}

	void LockWrite()
	{
		std::unique_lock<std::mutex> lock(m_mtx_);
		while (m_writing_ || m_count_ > 0) // 有多个线程在读或单个线程在写,等待
		{
			m_cond_.wait(lock);
		}
		m_writing_ = true;        // 单线程写
	}

	void UnLockWrite()
	{
		std::unique_lock<std::mutex> lock(m_mtx_);
		m_writing_ = false;         // 线程写完
		m_cond_.notify_all();       // 唤醒所有的读写线程
	}

private:
	std::mutex m_mtx_;
	std::condition_variable m_cond_;

	// volatile告诉编译器被其修饰的变量可能被多个线程同时访问, 因此不要对该变量进行优化,以确保线程之间可以正确的读取和写入该值
	volatile int m_count_;
	volatile bool m_writing_;
};

#endif

可打断锁

// 可打断锁: 一种能够响应其他线程的中断请求的锁
// 使用场景: 陷入内核等待的线程可被打断
#ifndef _ZD_INTERRUPTLOCK_H_
#define _ZD_INTERRUPTLOCK_H_

#if defined(_MSC_VER) && _MSC_VER>1000
#pragma once
#endif

#include <mutex>
#include <condition_variable>
#include <atomic>

class ZDInterruptLock
{
public:
	ZDInterruptLock()
	{
	}

	virtual ~ZDInterruptLock() = default;

	void Lock() 
	{
		std::unique_lock<std::mutex> lock(m_mtx_);
		m_status = 0;
		m_cond_.wait(lock, [&] { return 0 != m_status; });
	}

	bool TryLock() 
	{
		std::unique_lock<std::mutex> lock(m_mtx_);
		if (0 != m_status)
		{
			m_status = 0;
			return true;
		}

		return false;
	}

	void UnLock() 
	{
		{
			std::lock_guard<std::mutex> lock(m_mtx_);
			m_status = 1;
		}
		m_cond_.notify_one(); 
	}

	void Interrupt() 
	{
		{
			std::lock_guard<std::mutex> lock(m_mtx_);
			m_status = 2;
		}
		m_cond_.notify_all();
	}


	bool IsInterrupt() const 
	{
		std::lock_guard<std::mutex> lock(m_mtx_);
		return 2 == m_status;
	}

private:
	mutable std::mutex m_mtx_;
	std::condition_variable m_cond_;
	std::atomic<int> m_status;
};

#endif

相关推荐

  1. c++ 打断

    2024-04-01 15:42:03       15 阅读
  2. C++

    2024-04-01 15:42:03       22 阅读
  3. linux 内核同步互斥技术之

    2024-04-01 15:42:03       34 阅读
  4. 乐观、悲观、互斥

    2024-04-01 15:42:03       9 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-01 15:42:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-01 15:42:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-01 15:42:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-01 15:42:03       20 阅读

热门阅读

  1. Delphi 的 SuperObject 解析和编码 Json 字符串的示例

    2024-04-01 15:42:03       14 阅读
  2. c++基础学习第五天半(类和对象)

    2024-04-01 15:42:03       19 阅读
  3. 鸿蒙(HarmonyOS)ArkTs语言基础教程(大纲)

    2024-04-01 15:42:03       16 阅读
  4. 【Python进阶(二)】——程序调试方法

    2024-04-01 15:42:03       18 阅读
  5. C++进阶编程 --- 2.初始STL

    2024-04-01 15:42:03       17 阅读
  6. 【C语言】字符串

    2024-04-01 15:42:03       19 阅读
  7. 3498. 日期差值

    2024-04-01 15:42:03       17 阅读
  8. 第八章 贪心算法 part05

    2024-04-01 15:42:03       18 阅读
  9. CSS学习

    2024-04-01 15:42:03       18 阅读
  10. Hive查询转换与Hadoop生态系统引擎与优势

    2024-04-01 15:42:03       18 阅读
  11. python语言访问字典元素

    2024-04-01 15:42:03       14 阅读