Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct WaitingNode {
- std::condition_variable cv;
- bool released = false;
- };
- class Semaphore {
- public:
- explicit Semaphore(int count) : count_(count) {
- }
- void Leave() {
- std::unique_lock<std::mutex> lock(mutex_);
- ++count_;
- if (!waiting_queue_.empty()) {
- waiting_queue_.front().released = true;
- waiting_queue_.front().cv.notify_one();
- }
- }
- void Enter() {
- std::unique_lock<std::mutex> lock(mutex_);
- if (count_ == 0 || !waiting_queue_.empty()) {
- waiting_queue_.emplace_back();
- auto& wnode = waiting_queue_.back();
- wnode.cv.wait(lock, [&wnode] { return wnode.released; });
- waiting_queue_.pop_front();
- }
- --count_;
- }
- private:
- std::mutex mutex_;
- int count_ = 0;
- std::list<WaitingNode> waiting_queue_;
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement