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;
	};

参考资料:https://blog.csdn.net/zouxinfox/article/details/5848519

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章