mutex.h 993 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #ifndef RVC_VENDOR_MUTEX_H_
  2. #define RVC_VENDOR_MUTEX_H_
  3. #pragma once
  4. #ifdef _WIN32
  5. #include <Windows.h>
  6. #else
  7. #include <pthread.h>
  8. #endif //_WIN32
  9. namespace cmb {
  10. class noncopyable
  11. {
  12. protected:
  13. noncopyable(){}
  14. ~noncopyable(){}
  15. private:
  16. noncopyable(const noncopyable&);
  17. const noncopyable& operator=(const noncopyable&);
  18. };
  19. class mutex : private noncopyable
  20. {
  21. friend class condition;
  22. public:
  23. mutex();
  24. ~mutex();
  25. void lock();
  26. void unlock();
  27. private:
  28. #if defined(_MSC_VER)
  29. CRITICAL_SECTION csection_;
  30. #elif defined(__GNUC__)
  31. pthread_mutex_t mutx_;
  32. #endif
  33. };
  34. class unique_lock : private noncopyable
  35. {
  36. public:
  37. unique_lock(mutex& m) : mutex_(m)
  38. {
  39. mutex_.lock();
  40. owns_ = true;
  41. }
  42. ~unique_lock()
  43. {
  44. if (owns_)
  45. {
  46. mutex_.unlock();
  47. }
  48. }
  49. void lock()
  50. {
  51. owns_ = true;
  52. mutex_.lock();
  53. }
  54. void unlock()
  55. {
  56. owns_ = false;
  57. mutex_.unlock();
  58. }
  59. private:
  60. mutex& mutex_;
  61. bool owns_;
  62. };
  63. }
  64. #endif // RVC_VENDOR_MUTEX_H_