NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
condition_variable.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_ASYNC_CONDITION_VARIABLE_HPP__
2#define NEFORCE_CORE_ASYNC_CONDITION_VARIABLE_HPP__
3
10
13NEFORCE_BEGIN_NAMESPACE__
14
20
26
33enum class cv_status {
36};
37
38
40NEFORCE_BEGIN_INNER__
41
48class NEFORCE_API condition_variable_base {
49public:
50#ifdef NEFORCE_PLATFORM_WINDOWS
51 using native_handle_type = ::CONDITION_VARIABLE;
52#else
53 using native_handle_type = ::pthread_cond_t;
54#endif
55
56private:
57 native_handle_type cond_;
58
59public:
60 condition_variable_base();
61
62 condition_variable_base(const condition_variable_base&) = delete;
63 condition_variable_base& operator=(const condition_variable_base&) = delete;
64
65 condition_variable_base(condition_variable_base&&) = default;
66 condition_variable_base& operator=(condition_variable_base&&) = default;
67
68 ~condition_variable_base();
69
70 native_handle_type* native_handle() noexcept { return &cond_; }
71
80 void wait(mutex& mtx);
81
91 cv_status wait_until(mutex& mtx, int64_t sec, int64_t ns);
92
103 cv_status wait_until(mutex& mtx, bool is_monotonic, int64_t sec, int64_t ns);
104
105
111 void notify_one() noexcept;
112
118 void notify_all() noexcept;
119};
120
121NEFORCE_END_INNER__
123
131public:
132 using base_type = inner::condition_variable_base;
133 using native_handle_type = base_type::native_handle_type;
134 using clock_type = _NEFORCE steady_clock;
135
136private:
137 base_type cond_;
138
146 template <typename Dur>
147 cv_status __wait_until_impl(unique_lock<mutex>& lock, const time_point<steady_clock, Dur>& util) {
148 auto s = util.to_sec();
149 const nanoseconds ns(util - s);
150 cond_.wait_until(*lock.mutex(), true, s.since_epoch().count(), ns.count());
152 }
153
161 template <typename Dur>
162 cv_status __wait_until_impl(unique_lock<mutex>& lock, const time_point<system_clock, Dur>& util) {
163 auto sec = util.to_sec();
164 const nanoseconds nanosec(util - sec);
165 cond_.wait_until(*lock.mutex(), sec.since_epoch().count(), nanosec.count());
167 }
168
169public:
174
179
180 condition_variable(const condition_variable&) = delete;
181 condition_variable& operator=(const condition_variable&) = delete;
182
183 condition_variable(condition_variable&& other) = default;
184 condition_variable& operator=(condition_variable&& other) = default;
185
190 native_handle_type* native_handle() noexcept { return cond_.native_handle(); }
191
195 void notify_one() noexcept { cond_.notify_one(); }
196
200 void notify_all() noexcept { cond_.notify_all(); }
201
208 void wait(unique_lock<mutex>& lock) { cond_.wait(*lock.mutex()); }
209
218 template <typename Pred>
219 void wait(unique_lock<mutex>& lock, Pred pred) {
220 while (!pred()) {
221 wait(lock);
222 }
223 }
224
232 template <typename Dur>
234 return this->__wait_until_impl(lock, util);
235 }
236
244 template <typename Dur>
246 return this->__wait_until_impl(lock, util);
247 }
248
259 template <typename Clock, typename Dur>
261 const typename Clock::time_point entry = Clock::now();
262 const auto atime = clock_type::now() + ceil<clock_type::duration>(util - entry);
263
264 if (this->__wait_until_impl(lock, atime) == cv_status::success) {
265 return cv_status::success;
266 }
267 if (Clock::now() < util) {
268 return cv_status::success;
269 }
270 return cv_status::timeout;
271 }
272
285 template <typename Clock, typename Dur, typename Pred>
287 while (!pred()) {
288 if (this->wait_until(lock, util) == cv_status::timeout) {
289 return pred();
290 }
291 }
292 return true;
293 }
294
303 template <typename Rep, typename Period>
305 const auto atime = steady_clock::now() + ceil<steady_clock::duration>(rest);
306 return this->wait_until(lock, atime);
307 }
308
319 template <typename Rep, typename Period, typename Pred>
320 bool wait_for(unique_lock<mutex>& lock, const duration<Rep, Period>& rest, Pred pred) {
321 const auto atime = steady_clock::now() + ceil<steady_clock::duration>(rest);
322 return this->wait_until(lock, atime, _NEFORCE move(pred));
323 }
324};
325 // ConditionVariables
327 // AsyncComponents
329
330NEFORCE_END_NAMESPACE__
331#endif // NEFORCE_CORE_ASYNC_CONDITION_VARIABLE_HPP__
native_handle_type * native_handle() noexcept
获取原生句柄
cv_status wait_until(unique_lock< mutex > &lock, const time_point< Clock, Dur > &util)
等待直到任意时钟时间点
~condition_variable()=default
析构函数
bool wait_for(unique_lock< mutex > &lock, const duration< Rep, Period > &rest, Pred pred)
带谓词的等待指定持续时间
condition_variable()=default
构造函数
inner::condition_variable_base base_type
基类类型
void notify_all() noexcept
通知所有等待线程
void notify_one() noexcept
通知一个等待线程
void wait(unique_lock< mutex > &lock, Pred pred)
带谓词的无限期等待
cv_status wait_until(unique_lock< mutex > &lock, const time_point< steady_clock, Dur > &util)
等待直到稳定时钟时间点
base_type::native_handle_type native_handle_type
原生句柄类型
cv_status wait_for(unique_lock< mutex > &lock, const duration< Rep, Period > &rest)
等待指定的持续时间
_NEFORCE steady_clock clock_type
默认时钟类型
bool wait_until(unique_lock< mutex > &lock, const time_point< Clock, Dur > &util, Pred pred)
带谓词的等待直到时间点
cv_status wait_until(unique_lock< mutex > &lock, const time_point< system_clock, Dur > &util)
等待直到系统时钟时间点
void wait(unique_lock< mutex > &lock)
无限期等待
锁管理器模板
独占锁管理器模板
时钟类型
cv_status
条件变量等待状态
long long int64_t
64位有符号整数类型
int native_handle_type
系统句柄类型
duration< int64_t, nano > nanoseconds
纳秒持续时间
@ wait
等待操作
NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 decimal_t ceil(const decimal_t x) noexcept
向上取整
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
互斥锁
持续时间类模板
constexpr rep count() const noexcept
获取计数值
稳定时钟
static time_point now() noexcept
获取当前时间点
static time_point now() noexcept
获取当前时间点
时间点类模板