5#if defined(__cpp_lib_semaphore) || __cplusplus >= 202002l
9#include <condition_variable>
16 template<std::ptrdiff_t least_max_value = std::numeric_limits<std::ptrdiff_t>::max()>
17 class counting_semaphore {
19 static constexpr std::ptrdiff_t
max() noexcept {
return least_max_value;}
20 explicit counting_semaphore(std::ptrdiff_t desired = 0) : count_(desired) {}
21 counting_semaphore(
const counting_semaphore&) =
delete;
24 std::unique_lock<std::mutex>
lock(mutex_);
26 condition_.wait(lock);
31 bool try_acquire() noexcept {
32 std::unique_lock<std::mutex>
lock(mutex_);
40 bool try_acquire_for(
const std::chrono::milliseconds& duration) {
41 std::unique_lock<std::mutex>
lock(mutex_);
42 if (condition_.wait_for(lock, duration, [
this]() { return count_ > 0; })) {
49 template<
class clock_t,
class duration_t >
50 bool try_acquire_until(
const std::chrono::time_point<clock_t, duration_t>& timeout_time) {
51 return try_acquire_until(timeout_time, [
this] {
return count_ > 0;});
54 template<
class clock_t,
class duration_t,
class predicate_t >
55 bool try_acquire_until(
const std::chrono::time_point<clock_t, duration_t>& timeout_time, predicate_t stop_waiting) {
56 std::unique_lock<std::mutex>
lock(mutex_);
57 if (condition_.wait_until(lock, timeout_time, stop_waiting)) {
64 void release(std::ptrdiff_t update = 1) {
65 std::lock_guard<std::mutex>
lock(mutex_);
66 for (std::ptrdiff_t index = 0; index < update; ++index) {
68 condition_.notify_one();
72 std::ptrdiff_t available()
const {
73 std::lock_guard<std::mutex>
lock(mutex_);
78 mutable std::mutex mutex_;
79 std::condition_variable condition_;
80 std::ptrdiff_t count_;
83 using binary_semaphore = std::counting_semaphore<1>;
xtd::threading::lock_guard lock
Provides a mechanism that synchronizes access to objects with xtd::threading::monitor.
Definition lock.h:22
@ release
Build type release.