25 using is_thread_safe = std::true_type;
29 bool try_add(T n) BOND_NOEXCEPT
31 if (n <= this->max_value())
33 const auto max_val = this->max_value() - n;
35 for (
auto val = _value.load(std::memory_order::memory_order_acquire); val <= max_val; )
37 if (_value.compare_exchange_weak(
40 std::memory_order::memory_order_release,
41 std::memory_order::memory_order_acquire))
51 void subtract(T n) BOND_NOEXCEPT
53 BOOST_ASSERT(
value() >= n);
54 _value.fetch_sub(n, std::memory_order::memory_order_relaxed);
60 return _value.load(std::memory_order::memory_order_relaxed);
64 std::atomic<T> _value{};