1#ifndef NEFORCE_CORE_ASYNC_CALL_ONCE_HPP__
2#define NEFORCE_CORE_ASYNC_CALL_ONCE_HPP__
13NEFORCE_BEGIN_NAMESPACE__
42 template <
typename Callable,
typename... Args>
43 friend void call_once(once_flag& flag, Callable&& func, Args&&... args);
46 once_flag()
noexcept =
default;
47 once_flag(
const once_flag&) =
delete;
48 once_flag& operator=(
const once_flag&) =
delete;
49 once_flag(once_flag&&) =
delete;
50 once_flag& operator=(once_flag&&) =
delete;
67template <
typename Callable,
typename... Args>
68void call_once(once_flag& flag, Callable&& func, Args&&... args) {
97 if (spin_count < 10) {
98 for (
uint32_t i = 0; i < (1u << spin_count); ++i) {
103 this_thread::yield();
112NEFORCE_END_NAMESPACE__
friend void call_once(once_flag &flag, Callable &&func, Args &&... args)
单次调用函数
NEFORCE_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
void call_once(once_flag &flag, Callable &&func, Args &&... args)
单次调用函数
unsigned int uint32_t
32位无符号整数类型
NEFORCE_CONSTEXPR14 inner::__invoke_result_aux< Callable, Args... >::type invoke(Callable &&f, Args &&... args) noexcept(is_nothrow_invocable< Callable, Args... >::value)
统一调用接口
NEFORCE_INLINE17 constexpr auto memory_order_acq_rel
获取-释放内存顺序常量
NEFORCE_INLINE17 constexpr auto memory_order_release
释放内存顺序常量
NEFORCE_INLINE17 constexpr auto memory_order_relaxed
宽松内存顺序常量
NEFORCE_INLINE17 constexpr auto memory_order_acquire
获取内存顺序常量
T load(const memory_order mo=memory_order_seq_cst) const noexcept
原子加载操作
bool compare_exchange_strong(T &expected, T desired, const memory_order success, const memory_order failure) noexcept
强比较交换操作
void store(T value, const memory_order mo=memory_order_seq_cst) noexcept
原子存储操作