semaphore.h 1003 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #pragma once
  2. #include <mutex>
  3. #include <condition_variable>
  4. // C++11信号量实现,用于滑动窗口控制
  5. class Semaphore {
  6. public:
  7. explicit Semaphore(unsigned int count = 0) : max_count_(count) {}
  8. bool acquire() {
  9. std::unique_lock<std::mutex> lock(mutex_);
  10. if (count_ < max_count_) {
  11. ++count_;
  12. return true;
  13. }
  14. return false;
  15. }
  16. void release() {
  17. std::unique_lock<std::mutex> lock(mutex_);
  18. if (count_ <= 0) {
  19. return;
  20. }
  21. --count_;
  22. condition_.notify_one();
  23. }
  24. void wait() {
  25. std::unique_lock<std::mutex> lock(mutex_);
  26. condition_.wait(lock, [this]() { return count_ < max_count_; });
  27. }
  28. unsigned int get_count() const {
  29. std::unique_lock<std::mutex> lock(mutex_);
  30. return count_;
  31. }
  32. private:
  33. mutable std::mutex mutex_;
  34. std::condition_variable condition_;
  35. unsigned int count_ = 0;
  36. const unsigned int max_count_;
  37. };