C++笔记 多线程 区域锁的实现

概述

确切的说,区域锁(Scoped locking)不是一种锁的类型,而是一种锁的使用模式(pattern)。这个名词是Douglas C. Schmidt于1998年在其论文Scoped Locking提出,并在ACE框架里面使用。但作为一种设计思想,这种锁模式应该在更早之前就被业界广泛使用了。

区域锁实际上是RAII模式在锁上面的具体应用。RAII(Resource Acquisition Is Initialization)翻译成中文叫“资源获取即初始化”,最早是由C++的发明者 Bjarne Stroustrup为解决C++中资源分配与销毁问题而提出的。RAII的基本含义就是:C++中的资源(例如内存,文件句柄等等)应该由对象来管理,资源在对象的构造函数中初始化,并在对象的析构函数中被释放。STL中的智能指针就是RAII的一个具体应用。RAII在C++中使用如此广泛,甚至可以说,不会RAII的裁缝不是一个好程序员。

区域锁就是把锁封装到一个对象里面。锁的初始化放到构造函数,锁的释放放到析构函数。这样当锁离开作用域时,析构函数会自动释放锁。即使运行时抛出异常,由于析构函数仍然会自动运行,所以锁仍然能自动释放。

实现代码

	/**
	* @brief 局部锁的模板实现
	*/
	template<class T>
	struct ScopedLockImpl {
	public:
		/**
		* @brief 构造函数
		* @param[in] mutex Mutex
		*/
		ScopedLockImpl(T& mutex)
			:m_mutex(mutex) {
			m_mutex.lock();
			m_locked = true;
		}

		/**
		* @brief 析构函数,自动释放锁
		*/
		~ScopedLockImpl() {
			unlock();
		}

		/**
		* @brief 加锁
		*/
		void lock() {
			if (!m_locked) {
				m_mutex.lock();
				m_locked = true;
			}
		}

		/**
		* @brief 解锁
		*/
		void unlock() {
			if (m_locked) {
				m_mutex.unlock();
				m_locked = false;
			}
		}
	private:
		/// mutex
		T& m_mutex;
		/// 是否已上锁
		bool m_locked;
	};


	/**
	* @brief 互斥量
	*/
	class Mutex : Noncopyable {
	public:
		/// 局部锁
		typedef ScopedLockImpl<Mutex> Lock;

		/**
		* @brief 构造函数
		*/
		Mutex() {
			pthread_mutex_init(&m_mutex, nullptr);
		}

		/**
		* @brief 析构函数
		*/
		~Mutex() {
			pthread_mutex_destroy(&m_mutex);
		}

		/**
		* @brief 加锁
		*/
		void lock() {
			pthread_mutex_lock(&m_mutex);
		}

		/**
		* @brief 解锁
		*/
		void unlock() {
			pthread_mutex_unlock(&m_mutex);
		}
	private:
		/// mutex
		pthread_mutex_t m_mutex;
	};

参考资料:线程同步之利器(2)——区域锁(Scoped locking)_邹鑫的专栏-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值