Program Listing for File semaphore.hh

Return to documentation for file (include/reactor-cpp/semaphore.hh)

/*
 * Copyright (C) 2021 TU Dresden
 * All rights reserved.
 *
 * Authors:
 *   Christian Menard
 */

#ifndef REACTOR_CPP_SEMAPHORE_HH
#define REACTOR_CPP_SEMAPHORE_HH

#include <atomic>
#include <condition_variable>
#include <mutex>

namespace reactor {

class Semaphore {
private:
  int count_;
  std::mutex mutex_{};
  std::condition_variable cv_{};

public:
  explicit Semaphore(int count)
      : count_(count) {}

  void release(int increment) {
    {
      std::lock_guard<std::mutex> lock_guard(mutex_);
      count_ += increment;
    }
    cv_.notify_all();
  }

  void acquire() {
    std::unique_lock<std::mutex> lock_guard(mutex_);
    cv_.wait(lock_guard, [&]() { return count_ != 0; });
    count_--;
  }
};

} // namespace reactor

#endif // REACTOR_CPP_SEMAPHORE_HH