SharedMutex.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /**
  2. * SharedMutex.cpp
  3. * zhangyl 20191108
  4. */
  5. #include "SharedMutex.h"
  6. SharedMutex::SharedMutex()
  7. {
  8. #ifdef WIN32
  9. ::InitializeSRWLock(&m_SRWLock);
  10. #else
  11. ::pthread_rwlock_init(&m_SRWLock, nullptr);
  12. #endif
  13. }
  14. SharedMutex::~SharedMutex()
  15. {
  16. #ifdef WIN32
  17. //Windows上读写锁不需要显式销毁
  18. #else
  19. ::pthread_rwlock_destroy(&m_SRWLock);
  20. #endif
  21. }
  22. void SharedMutex::acquireReadLock()
  23. {
  24. #ifdef WIN32
  25. ::AcquireSRWLockShared(&m_SRWLock);
  26. #else
  27. ::pthread_rwlock_rdlock(&m_SRWLock);
  28. #endif
  29. }
  30. void SharedMutex::acquireWriteLock()
  31. {
  32. #ifdef WIN32
  33. ::AcquireSRWLockExclusive(&m_SRWLock);
  34. #else
  35. ::pthread_rwlock_wrlock(&m_SRWLock);
  36. #endif
  37. }
  38. void SharedMutex::unlockReadLock()
  39. {
  40. #ifdef WIN32
  41. ::ReleaseSRWLockShared(&m_SRWLock);
  42. #else
  43. ::pthread_rwlock_unlock(&m_SRWLock);
  44. #endif
  45. }
  46. void SharedMutex::unlockWriteLock()
  47. {
  48. #ifdef WIN32
  49. ::ReleaseSRWLockExclusive(&m_SRWLock);
  50. #else
  51. ::pthread_rwlock_unlock(&m_SRWLock);
  52. #endif
  53. }
  54. SharedLockGuard::SharedLockGuard(SharedMutex& sharedMutex) :
  55. m_SharedMutex(sharedMutex)
  56. {
  57. m_SharedMutex.acquireReadLock();
  58. }
  59. SharedLockGuard::~SharedLockGuard()
  60. {
  61. m_SharedMutex.unlockReadLock();
  62. }
  63. UniqueLockGuard::UniqueLockGuard(SharedMutex& sharedMutex) :
  64. m_SharedMutex(sharedMutex)
  65. {
  66. m_SharedMutex.acquireWriteLock();
  67. }
  68. UniqueLockGuard::~UniqueLockGuard()
  69. {
  70. m_SharedMutex.unlockWriteLock();
  71. }