mutex.h 849 B

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