4 #if defined(__cpp_lib_semaphore) || __cplusplus >= 202002l 8 #include <condition_variable> 15 template<std::ptrdiff_t least_max_value = std::numeric_limits<std::ptrdiff_t>::max()>
16 class counting_semaphore {
18 static constexpr std::ptrdiff_t
max() noexcept {
return least_max_value;}
19 explicit counting_semaphore(std::ptrdiff_t desired = 0) : count_(desired) {}
20 counting_semaphore(
const counting_semaphore&) =
delete;
23 std::unique_lock<std::mutex>
lock(mutex_);
25 condition_.wait(
lock);
30 bool try_acquire() noexcept {
31 std::unique_lock<std::mutex>
lock(mutex_);
39 bool try_acquire_for(
const std::chrono::milliseconds& duration) {
40 std::unique_lock<std::mutex>
lock(mutex_);
41 if (condition_.wait_for(
lock, duration, [
this]() { return count_ > 0; })) {
48 template<
class clock_t,
class duration_t >
49 bool try_acquire_until(
const std::chrono::time_point<clock_t, duration_t>& timeout_time) {
50 return try_acquire_until(timeout_time, [
this] {
return count_ > 0;});
53 template<
class clock_t,
class duration_t,
class predicate_t >
54 bool try_acquire_until(
const std::chrono::time_point<clock_t, duration_t>& timeout_time, predicate_t stop_waiting) {
55 std::unique_lock<std::mutex>
lock(mutex_);
56 if (condition_.wait_until(
lock, timeout_time, stop_waiting)) {
63 void release(std::ptrdiff_t update = 1) {
64 std::lock_guard<std::mutex>
lock(mutex_);
65 for (std::ptrdiff_t index = 0; index < update; ++index) {
67 condition_.notify_one();
71 std::ptrdiff_t available()
const {
72 std::lock_guard<std::mutex>
lock(mutex_);
77 mutable std::mutex mutex_;
78 std::condition_variable condition_;
79 std::ptrdiff_t count_;
82 using binary_semaphore = std::counting_semaphore<1>;
85
xtd::threading::lock_guard lock
Provides a mechanism that synchronizes access to objects with xtd::threading::monitor.
Definition: lock.h:22