Cond.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include "Cond.h"
  2. Cond::Cond()
  3. {
  4. #if defined(WIN32) && !defined(MINGW)
  5. InitializeCriticalSection(&m_mutex);
  6. InitializeConditionVariable(&m_cond);
  7. #else
  8. pthread_mutex_init(&m_mutex, NULL);
  9. pthread_cond_init(&m_cond, NULL);
  10. #endif
  11. }
  12. Cond::~Cond()
  13. {
  14. #if defined(WIN32) && !defined(MINGW)
  15. DeleteCriticalSection(&m_mutex);
  16. #else
  17. pthread_mutex_destroy(&m_mutex);
  18. pthread_cond_destroy(&m_cond);
  19. #endif
  20. }
  21. //加锁
  22. int Cond::Lock()
  23. {
  24. #if defined(WIN32) && !defined(MINGW)
  25. EnterCriticalSection(&m_mutex);
  26. return 0;
  27. #else
  28. return pthread_mutex_lock(&m_mutex);
  29. #endif
  30. }
  31. //解锁
  32. int Cond::Unlock()
  33. {
  34. #if defined(WIN32) && !defined(MINGW)
  35. LeaveCriticalSection(&m_mutex);
  36. return 0;
  37. #else
  38. return pthread_mutex_unlock(&m_mutex);
  39. #endif
  40. }
  41. int Cond::Wait(int timeOut)
  42. {
  43. #if defined(WIN32) && !defined(MINGW)
  44. if (timeOut < 0)
  45. {
  46. timeOut = INFINITE;
  47. }
  48. DWORD ret = SleepConditionVariableCS((PCONDITION_VARIABLE)&m_cond, &m_mutex, timeOut);
  49. #else
  50. int ret = pthread_cond_wait(&m_cond, &m_mutex);
  51. #endif
  52. return ret;
  53. }
  54. //固定时间等待
  55. int Cond::TimedWait(int second)
  56. {
  57. #if defined(WIN32) && !defined(MINGW)
  58. SleepConditionVariableCS((PCONDITION_VARIABLE)&m_cond, &m_mutex, second*1000);
  59. return 0;
  60. #else
  61. struct timespec abstime;
  62. //获取从当前时间,并加上等待时间, 设置进程的超时睡眠时间
  63. clock_gettime(CLOCK_REALTIME, &abstime);
  64. abstime.tv_sec += second;
  65. return pthread_cond_timedwait(&m_cond, &m_mutex, &abstime);
  66. #endif
  67. }
  68. int Cond::Signal()
  69. {
  70. #if defined(WIN32) && !defined(MINGW)
  71. int ret = 0;
  72. WakeConditionVariable((PCONDITION_VARIABLE)&m_cond);
  73. #else
  74. int ret = pthread_cond_signal(&m_cond);
  75. #endif
  76. return ret;
  77. }
  78. //唤醒所有睡眠线程
  79. int Cond::Broadcast()
  80. {
  81. #if defined(WIN32) && !defined(MINGW)
  82. WakeAllConditionVariable((PCONDITION_VARIABLE)&m_cond);
  83. return 0;
  84. #else
  85. return pthread_cond_broadcast(&m_cond);
  86. #endif
  87. }