ScopeLock.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #pragma once
  2. #include <pthread.h>
  3. #include <unistd.h>
  4. #include <sys/syscall.h>
  5. #include <cstring>
  6. #include <cerrno>
  7. #include <iostream>
  8. #include <cassert>
  9. class CCriticalSec {
  10. public:
  11. CCriticalSec() {
  12. pthread_mutexattr_t attr;
  13. pthread_mutexattr_init(&attr);
  14. pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
  15. int result = pthread_mutex_init(&m_mutex, &attr);
  16. pthread_mutexattr_destroy(&attr);
  17. if (result != 0) {
  18. std::cerr << "pthread_mutex_init failed: " << strerror(result) << std::endl;
  19. assert(false);
  20. }
  21. }
  22. ~CCriticalSec() {
  23. int result = pthread_mutex_destroy(&m_mutex);
  24. if (result != 0) {
  25. std::cerr << "pthread_mutex_destroy failed: " << strerror(result) << std::endl;
  26. }
  27. }
  28. void Lock() {
  29. int result = pthread_mutex_lock(&m_mutex);
  30. if (result != 0) {
  31. std::cerr << "pthread_mutex_lock failed: " << strerror(result) << std::endl;
  32. assert(false);
  33. }
  34. }
  35. void Unlock() {
  36. int result = pthread_mutex_unlock(&m_mutex);
  37. if (result != 0) {
  38. std::cerr << "pthread_mutex_unlock failed: " << strerror(result) << std::endl;
  39. assert(false);
  40. }
  41. }
  42. private:
  43. pthread_mutex_t m_mutex;
  44. };
  45. class CScopeLock {
  46. public:
  47. explicit CScopeLock(CCriticalSec& cs) : m_cs(cs) {
  48. m_cs.Lock();
  49. }
  50. ~CScopeLock() {
  51. m_cs.Unlock();
  52. }
  53. // ½ûÖ¹¿½±´ºÍ¸³Öµ
  54. CScopeLock(const CScopeLock&) = delete;
  55. CScopeLock& operator=(const CScopeLock&) = delete;
  56. private:
  57. CCriticalSec& m_cs;
  58. };