1#ifndef NEFORCE_CORE_ASYNC_ATOMIC_FUTEX_HPP__
2#define NEFORCE_CORE_ASYNC_ATOMIC_FUTEX_HPP__
14NEFORCE_BEGIN_NAMESPACE__
36template <u
int32_t WaiterBit = 0x80000000>
56 const bool ret =
futex_wait_until(&data_, assumed | WaiterBit, has_timeout, sec, ns,
false);
58 if (!ret || ((operand == assumed) ==
equal)) {
81 const bool ret =
futex_wait_until(&data_, assumed | WaiterBit, has_timeout, sec, ns,
true);
83 if (!ret || ((operand == assumed) ==
equal)) {
98 return load_and_test_until(assumed, operand,
equal, mo,
false, 0, 0);
111 template <
typename Dur>
114 auto sec = atime.to_sec();
116 return this->load_and_test_until(assumed, operand,
equal, mo,
true, sec.since_epoch().count(), ns);
129 template <
typename Dur>
132 auto sec = atime.to_sec();
134 return this->load_and_test_until_steady(assumed, operand,
equal, mo,
true, sec.since_epoch().count(), ns);
153 return data_.load(mo) & ~WaiterBit;
166 if ((old & ~WaiterBit) != value) {
167 return (old & ~WaiterBit);
169 return load_and_test(old, value,
false, mo);
181 if ((old & ~WaiterBit) == value) {
184 load_and_test(old, value,
true, mo);
196 template <
typename Rep,
typename Period>
214 template <
typename Clock,
typename Dur>
217 auto now = Clock::now();
224 }
while (now < atime);
236 template <
typename Dur>
240 if ((old & ~WaiterBit) == value) {
243 old = this->load_and_test_until_impl(old, value,
true, mo, atime);
244 return (old & ~WaiterBit) == value;
255 template <
typename Dur>
259 if ((old & ~WaiterBit) == value) {
262 old = this->load_and_test_until_impl(old, value,
true, mo, atime);
263 return (old & ~WaiterBit) == value;
274 const auto futex =
static_cast<uint32_t*
>(
static_cast<void*
>(&data_));
275 if (data_.exchange(value, mo) & WaiterBit) {
285NEFORCE_END_NAMESPACE__
NEFORCE_ALWAYS_INLINE bool load_when_equal_until(const uint32_t value, const memory_order mo, const time_point< system_clock, Dur > &atime)
在指定时间点前等待值等于指定值(系统时钟)
NEFORCE_ALWAYS_INLINE void store_notify_all(const uint32_t value, const memory_order mo)
存储新值并通知所有等待线程
atomic_futex(const uint32_t data)
构造函数
NEFORCE_ALWAYS_INLINE bool load_when_equal_for(const uint32_t value, const memory_order mo, const duration< Rep, Period > &rtime)
在指定时间内等待值等于指定值
NEFORCE_ALWAYS_INLINE void load_when_equal(const uint32_t value, const memory_order mo)
等待直到值等于指定值
NEFORCE_ALWAYS_INLINE bool load_when_equal_until(const uint32_t value, const memory_order mo, const time_point< Clock, Dur > &atime)
在指定时间点前等待值等于指定值(通用时钟)
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE uint32_t load(const memory_order mo) const
原子加载数据
NEFORCE_ALWAYS_INLINE uint32_t load_when_not_equal(const uint32_t value, const memory_order mo)
等待直到值不等于指定值
NEFORCE_ALWAYS_INLINE bool load_when_equal_until(const uint32_t value, const memory_order mo, const time_point< steady_clock, Dur > &atime)
在指定时间点前等待值等于指定值(单调时钟)
NEFORCE_NODISCARD constexpr bool equal(Iterator1 first1, Iterator1 last1, Iterator2 first2, BinaryPredicate binary_pred) noexcept(noexcept(++first1) &&noexcept(++first2) &&noexcept(binary_pred(*first1, *first2)))
比较两个范围是否相等
unsigned int uint32_t
32位无符号整数类型
long long int64_t
64位有符号整数类型
duration< int64_t, nano > nanoseconds
纳秒持续时间
void NEFORCE_API futex_notify(void *addr, bool all) noexcept
通知等待的线程
bool futex_wait_until(const platform_wait_t *addr, platform_wait_t old, const time_point< Clock, Dur > &timeout)
FUTEX定时等待函数
NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 decimal_t ceil(const decimal_t x) noexcept
向上取整
NEFORCE_INLINE17 constexpr auto memory_order_relaxed
宽松内存顺序常量
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
constexpr rep count() const noexcept
获取计数值
static time_point now() noexcept
获取当前时间点