用C++实现多线程Mutex锁(Win32)


本文目的:用C++和Windows的互斥对象(Mutex)来实现线程同步锁。

准备知识:1,内核对象互斥体(Mutex)的工作机理,WaitForSingleObject函数的用法,这些可以从MSDN获取详情; 2,当两个或更多线程需要同时访问一个共享资源时,系统需要使用同步机制来确保一次只有一个线程使用该资源。Mutex 是同步基元,它只向一个线程授予对共享资源的独占访问权。如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。

下边是我参考开源项目C++ Sockets的代码,写的线程锁类

Lock.h

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

Lock.cpp

  1. #include "Lock.h"   
  2.   
  3. //创建一个匿名互斥对象   
  4. Mutex::Mutex()  
  5. {  
  6.     m_mutex = ::CreateMutex(NULL, FALSE, NULL);  
  7. }  
  8.   
  9. //销毁互斥对象,释放资源   
  10. Mutex::~Mutex()  
  11. {  
  12.     ::CloseHandle(m_mutex);  
  13. }  
  14.   
  15. //确保拥有互斥对象的线程对被保护资源的独自访问   
  16. void Mutex::Lock() const  
  17. {  
  18.     DWORD d = WaitForSingleObject(m_mutex, INFINITE);  
  19. }  
  20.   
  21. //释放当前线程拥有的互斥对象,以使其它线程可以拥有互斥对象,对被保护资源进行访问   
  22. void Mutex::Unlock() const  
  23. {  
  24.     ::ReleaseMutex(m_mutex);  
  25. }  
  26.   
  27. //利用C++特性,进行自动加锁   
  28. CLock::CLock(const IMyLock& m) : m_lock(m)  
  29. {  
  30.     m_lock.Lock();  
  31. }  
  32.   
  33. //利用C++特性,进行自动解锁   
  34. CLock::~CLock()  
  35. {  
  36.     m_lock.Unlock();  
  37. }  
  • 1
  • 2
  • 下一页

相关内容