歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 用C++實現多線程Mutex鎖(Win32)

用C++實現多線程Mutex鎖(Win32)

日期:2017/3/1 10:46:52   编辑:Linux編程

本文目的:用C++和Windows的互斥對象(Mutex)來實現線程同步鎖。

准備知識:1,內核對象互斥體(Mutex)的工作機理,WaitForSingleObject函數的用法,這些可以從MSDN獲取詳情; 2,當兩個或更多線程需要同時訪問一個共享資源時,系統需要使用同步機制來確保一次只有一個線程使用該資源。Mutex 是同步基元,它只向一個線程授予對共享資源的獨占訪問權。如果一個線程獲取了互斥體,則要獲取該互斥體的第二個線程將被掛起,直到第一個線程釋放該互斥體。

下邊是我參考開源項目C++ Sockets的代碼,寫的線程鎖類

Lock.h

  1. #ifndef _Lock_H
  2. #define _Lock_H
  3. #include <windows.h>
  4. //鎖接口類
  5. class IMyLock
  6. {
  7. public:
  8. virtual ~IMyLock() {}
  9. virtual void Lock() const = 0;
  10. virtual void Unlock() const = 0;
  11. };
  12. //互斥對象鎖類
  13. class Mutex : public IMyLock
  14. {
  15. public:
  16. Mutex();
  17. ~Mutex();
  18. virtual void Lock() const;
  19. virtual void Unlock() const;
  20. private:
  21. HANDLE m_mutex;
  22. };
  23. //鎖
  24. class CLock
  25. {
  26. public:
  27. CLock(const IMyLock&);
  28. ~CLock();
  29. private:
  30. const IMyLock& m_lock;
  31. };
  32. #endif

Lock.cpp

  1. #include "Lock.h"
  2. //創建一個匿名互斥對象
  3. Mutex::Mutex()
  4. {
  5. m_mutex = ::CreateMutex(NULL, FALSE, NULL);
  6. }
  7. //銷毀互斥對象,釋放資源
  8. Mutex::~Mutex()
  9. {
  10. ::CloseHandle(m_mutex);
  11. }
  12. //確保擁有互斥對象的線程對被保護資源的獨自訪問
  13. void Mutex::Lock() const
  14. {
  15. DWORD d = WaitForSingleObject(m_mutex, INFINITE);
  16. }
  17. //釋放當前線程擁有的互斥對象,以使其它線程可以擁有互斥對象,對被保護資源進行訪問
  18. void Mutex::Unlock() const
  19. {
  20. ::ReleaseMutex(m_mutex);
  21. }
  22. //利用C++特性,進行自動加鎖
  23. CLock::CLock(const IMyLock& m) : m_lock(m)
  24. {
  25. m_lock.Lock();
  26. }
  27. //利用C++特性,進行自動解鎖
  28. CLock::~CLock()
  29. {
  30. m_lock.Unlock();
  31. }
Copyright © Linux教程網 All Rights Reserved