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
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 condition_variable_base(condition_variable_base&&) = delete;
65 condition_variable_base& operator=(condition_variable_base&&) = delete;
66
67 ~condition_variable_base();
68
69 native_handle_type* native_handle() noexcept { return &cond_; }
70
79 void wait(mutex& mtx);
80
90 cv_status wait_until(mutex& mtx, int64_t sec, int64_t ns);
91
102 cv_status wait_until(mutex& mtx, bool is_monotonic, int64_t sec, int64_t ns);
103
104
110 void notify_one() noexcept;
111
117 void notify_all() noexcept;
118};
119
120NEFORCE_END_INNER__
122
130public:
131 using base_type = inner::condition_variable_base;
132 using native_handle_type = base_type::native_handle_type;
133 using clock_type = _NEFORCE steady_clock;
134
135private:
136 base_type cond_;
137
145 template <typename Dur>
146 cv_status __wait_until_impl(unique_lock<mutex>& lock, const time_point<steady_clock, Dur>& util) {
147 auto s = util.to_sec();
148 const nanoseconds ns(util - s);
149 cond_.wait_until(*lock.mutex(), true, s.since_epoch().count(), ns.count());
151 }
152
160 template <typename Dur>
161 cv_status __wait_until_impl(unique_lock<mutex>& lock, const time_point<system_clock, Dur>& util) {
162 auto sec = util.to_sec();
163 const nanoseconds nanosec(util - sec);
164 cond_.wait_until(*lock.mutex(), sec.since_epoch().count(), nanosec.count());
166 }
167
168public:
173
178
179 condition_variable(const condition_variable&) = delete;
180 condition_variable& operator=(const condition_variable&) = delete;
181 condition_variable(condition_variable&& other) = delete;
182 condition_variable& operator=(condition_variable&& other) = delete;
183
188 native_handle_type* native_handle() noexcept { return cond_.native_handle(); }
189
193 void notify_one() noexcept { cond_.notify_one(); }
194
198 void notify_all() noexcept { cond_.notify_all(); }
199
206 void wait(unique_lock<mutex>& lock) { cond_.wait(*lock.mutex()); }
207
216 template <typename Pred>
217 void wait(unique_lock<mutex>& lock, Pred pred) {
218 while (!pred()) {
219 wait(lock);
220 }
221 }
222
230 template <typename Dur>
232 return this->__wait_until_impl(lock, util);
233 }
234
242 template <typename Dur>
244 return this->__wait_until_impl(lock, util);
245 }
246
257 template <typename Clock, typename Dur>
259 const typename Clock::time_point entry = Clock::now();
260 const auto atime = clock_type::now() + ceil<clock_type::duration>(util - entry);
261
262 if (this->__wait_until_impl(lock, atime) == cv_status::success) {
263 return cv_status::success;
264 }
265 if (Clock::now() < util) {
266 return cv_status::success;
267 }
268 return cv_status::timeout;
269 }
270
283 template <typename Clock, typename Dur, typename Pred>
285 while (!pred()) {
286 if (this->wait_until(lock, util) == cv_status::timeout) {
287 return pred();
288 }
289 }
290 return true;
291 }
292
301 template <typename Rep, typename Period>
303 const auto atime = steady_clock::now() + ceil<steady_clock::duration>(rest);
304 return this->wait_until(lock, atime);
305 }
306
317 template <typename Rep, typename Period, typename Pred>
318 bool wait_for(unique_lock<mutex>& lock, const duration<Rep, Period>& rest, Pred pred) {
319 const auto atime = steady_clock::now() + ceil<steady_clock::duration>(rest);
320 return this->wait_until(lock, atime, _NEFORCE move(pred));
321 }
322};
323 // ConditionVariables
325 // AsyncComponents
327
328NEFORCE_END_NAMESPACE__
329#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
条件变量等待状态
unsigned char uint8_t
8位无符号整数类型
long long int64_t
64位有符号整数类型
void * native_handle_type
系统句柄类型
duration< int64_t, nano > nanoseconds
纳秒持续时间
@ wait
等待操作
constexpr 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
获取当前时间点
时间点类模板