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

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