smutex.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include "smutex.h"
  2. #include "public.h"
  3. //////////////////////////////////////////////////////////////////////
  4. // Construction/Destruction
  5. //////////////////////////////////////////////////////////////////////
  6. //互斥锁创建
  7. SMutex::SMutex()
  8. {
  9. #ifdef WIN32
  10. m_mFileMutex = ::CreateMutex(NULL, FALSE, NULL);
  11. #else
  12. pthread_mutex_init (&m_mFileMutex, NULL);
  13. #endif
  14. m_bLocked=false;
  15. }
  16. //互斥锁回收
  17. SMutex::~SMutex()
  18. {
  19. #ifdef WIN32
  20. if (m_bLocked)
  21. ReleaseMutex(m_mFileMutex);
  22. CloseHandle(m_mFileMutex);
  23. #else
  24. if (m_bLocked)
  25. pthread_mutex_unlock(&m_mFileMutex);
  26. pthread_mutex_destroy(&m_mFileMutex);
  27. #endif
  28. m_bLocked = false;
  29. }
  30. //等待互斥资源。等待时间为毫秒
  31. bool SMutex::Wait(int iTime)
  32. {
  33. if (iTime <= 0) iTime = 1000000000; //277小时
  34. // if (iTime>300000) iTime=300000;
  35. #ifdef WIN32
  36. if (WaitForSingleObject(m_mFileMutex, iTime) == WAIT_OBJECT_0)
  37. {
  38. m_bLocked = true;
  39. return true;
  40. }
  41. else
  42. {
  43. m_bLocked = false;
  44. return false;
  45. }
  46. #else
  47. INT64 tmEnd = GetSystemTime() + iTime;
  48. while (GetSystemTime() < tmEnd)
  49. {
  50. if (pthread_mutex_trylock(&m_mFileMutex) == 0)
  51. {
  52. m_bLocked = true;
  53. return true;
  54. }
  55. Sleep(50);
  56. }
  57. m_bLocked = false;
  58. return false;
  59. #endif
  60. }
  61. //互斥锁释放
  62. void SMutex::Unlock()
  63. {
  64. #ifndef _WIN32
  65. pthread_mutex_unlock(&m_mFileMutex);
  66. #else
  67. ReleaseMutex(m_mFileMutex);
  68. #endif
  69. m_bLocked=false;
  70. }
  71. ////////////////////////////////////////////////////////////////////////////////////////////////////
  72. SAutoLock::SAutoLock(SMutex* p)
  73. {
  74. m_pLock = p;
  75. m_pLock->Wait();
  76. }
  77. SAutoLock::~SAutoLock()
  78. {
  79. m_pLock->Unlock();
  80. }