NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
call_once.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_ASYNC_CALL_ONCE_HPP__
2#define NEFORCE_CORE_ASYNC_CALL_ONCE_HPP__
3
10
13NEFORCE_BEGIN_NAMESPACE__
14
20
26
38class once_flag {
39private:
40 atomic<uint32_t> state_{0};
41
42 template <typename Callable, typename... Args>
43 friend void call_once(once_flag& flag, Callable&& func, Args&&... args);
44
45public:
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;
51};
52
67template <typename Callable, typename... Args>
68void call_once(once_flag& flag, Callable&& func, Args&&... args) {
69 if (flag.state_.load(memory_order_acquire) == 2) {
70 return;
71 }
72
73 uint32_t spin_count = 0;
74 while (true) {
75 const uint32_t state = flag.state_.load(memory_order_acquire);
76 if (state == 2) {
77 return;
78 }
79
80 if (state == 0) {
81 uint32_t expected = 0;
83 try {
84 _NEFORCE invoke<Callable, Args...>(_NEFORCE forward<Callable>(func),
85 _NEFORCE forward<Args>(args)...);
86 flag.state_.store(2, memory_order_release);
87 return;
88 } catch (...) {
89 flag.state_.store(0, memory_order_release);
90 throw;
91 }
92 }
93 spin_count = 0;
94 continue;
95 }
96
97 if (spin_count < 10) {
98 for (uint32_t i = 0; i < (1u << spin_count); ++i) {
99 this_thread::relax();
100 }
101 ++spin_count;
102 } else {
103 this_thread::yield();
104 }
105 }
106}
107 // CallOnce
109 // AsyncComponents
111
112NEFORCE_END_NAMESPACE__
113#endif // NEFORCE_CORE_ASYNC_CALL_ONCE_HPP__
原子类型完整实现
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
原子存储操作