79aff463cb76d1c985e551512a543a7d9ca99b3bdc6407808455a1b6012f7ad4337c9da690f9d1e7104fe4e17ae91ac0acc2e473e500fa33899991ec25136d 816 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #ifndef SIGNAL_H
  2. #define SIGNAL_H
  3. #include <mutex>
  4. #include <condition_variable>
  5. class Signal {
  6. public:
  7. Signal() : mFlag(false), mWaiting(false) {}
  8. void wait() {
  9. std::unique_lock<std::mutex> lock(mMutex);
  10. while (!mFlag) {
  11. mWaiting = true;
  12. mCond.wait(lock);
  13. }
  14. }
  15. std::cv_status waitFor(std::chrono::milliseconds ms) {
  16. std::unique_lock<std::mutex> lock(mMutex);
  17. return mCond.wait_for(lock, ms);
  18. }
  19. void notify() {
  20. std::unique_lock<std::mutex> lock(mMutex);
  21. mFlag = true;
  22. mCond.notify_all();
  23. }
  24. void reset() {
  25. std::unique_lock<std::mutex> lock(mMutex);
  26. mFlag = false;
  27. mWaiting = false;
  28. }
  29. bool isWaiting() {
  30. return mWaiting;
  31. }
  32. private:
  33. bool mFlag;
  34. bool mWaiting;
  35. std::mutex mMutex;
  36. std::condition_variable mCond;
  37. };
  38. #endif