歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

互斥對象鎖和臨界區鎖性能比較

在Win32平台上進行多線程編程,常會用到鎖。下邊用C++實現了互斥對象(Mutex)鎖和臨界區(CRITICAL_SECTION)鎖,以加深理解和今後方便使用。代碼已在VS2005環境下編譯測試通過。

Lock.h

  1. #ifndef _Lock_H   
  2. #define _Lock_H   
  3.   
  4. #include <windows.h>   
  5.   
  6.   
  7. //鎖接口類   
  8. class ILock  
  9. {  
  10. public:  
  11.     virtual ~ILock() {}  
  12.   
  13.     virtual void Lock() const = 0;  
  14.     virtual void Unlock() const = 0;  
  15. };  
  16.   
  17. //互斥對象鎖類   
  18. class Mutex : public ILock  
  19. {  
  20. public:  
  21.     Mutex();  
  22.     ~Mutex();  
  23.   
  24.     virtual void Lock() const;  
  25.     virtual void Unlock() const;  
  26.   
  27. private:  
  28.     HANDLE m_mutex;  
  29. };  
  30.   
  31. //臨界區鎖類   
  32. class CriSection : public ILock  
  33. {  
  34. public:  
  35.     CriSection();  
  36.     ~CriSection();  
  37.   
  38.     virtual void Lock() const;  
  39.     virtual void Unlock() const;  
  40.   
  41. private:  
  42.     CRITICAL_SECTION m_critclSection;  
  43. };  
  44.   
  45.   
  46. //鎖   
  47. class CMyLock  
  48. {  
  49. public:  
  50.     CMyLock(const ILock&);  
  51.     ~CMyLock();  
  52.   
  53. private:  
  54.     const ILock& m_lock;  
  55. };  
  56.   
  57.   
  58. #endif  

Lock.cpp

  1. #include "Lock.h"   
  2.   
  3. //---------------------------------------------------------------------------   
  4.   
  5. //創建一個匿名互斥對象   
  6. Mutex::Mutex()  
  7. {  
  8.     m_mutex = ::CreateMutex(NULL, FALSE, NULL);  
  9. }  
  10.   
  11. //銷毀互斥對象,釋放資源   
  12. Mutex::~Mutex()  
  13. {  
  14.     ::CloseHandle(m_mutex);  
  15. }  
  16.   
  17. //確保擁有互斥對象的線程對被保護資源的獨自訪問   
  18. void Mutex::Lock() const  
  19. {  
  20.     DWORD d = WaitForSingleObject(m_mutex, INFINITE);  
  21. }  
  22.   
  23. //釋放當前線程擁有的互斥對象,以使其它線程可以擁有互斥對象,對被保護資源進行訪問   
  24. void Mutex::Unlock() const  
  25. {  
  26.     ::ReleaseMutex(m_mutex);  
  27. }  
  28.   
  29. //---------------------------------------------------------------------------   
  30.   
  31. //初始化臨界資源對象   
  32. CriSection::CriSection()  
  33. {  
  34.     ::InitializeCriticalSection(&m_critclSection);  
  35. }  
  36.   
  37. //釋放臨界資源對象   
  38. CriSection::~CriSection()  
  39. {  
  40.     ::DeleteCriticalSection(&m_critclSection);  
  41. }  
  42.   
  43. //進入臨界區,加鎖   
  44. void CriSection::Lock() const  
  45. {  
  46.     ::EnterCriticalSection((LPCRITICAL_SECTION)&m_critclSection);  
  47. }     
  48.   
  49. //離開臨界區,解鎖   
  50. void CriSection::Unlock() const  
  51. {  
  52.     ::LeaveCriticalSection((LPCRITICAL_SECTION)&m_critclSection);  
  53. }  
  54.   
  55. //---------------------------------------------------------------------------   
  56.   
  57. //利用C++特性,進行自動加鎖   
  58. CMyLock::CMyLock(const ILock& m) : m_lock(m)  
  59. {  
  60.     m_lock.Lock();  
  61. }  
  62.   
  63. //利用C++特性,進行自動解鎖   
  64. CMyLock::~CMyLock()  
  65. {  
  66.     m_lock.Unlock();  
  67. }  
Copyright © Linux教程網 All Rights Reserved