MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
packaged_task.hpp
浏览该文件的文档.
1#ifndef MSTL_CORE_ASYNC_PACKAGED_TASK_HPP__
2#define MSTL_CORE_ASYNC_PACKAGED_TASK_HPP__
3
11
15
21
29template <typename Res, typename... Args>
30class packaged_task<Res(Args...)> {
31 using StateType = _INNER __future_base::task_state_base<Res(Args...)>;
32
33 shared_ptr<StateType> state_ptr;
34
35public:
41 packaged_task() noexcept {}
42
51 template <typename Func, typename = enable_if_t<!is_same_v<packaged_task, remove_cvref_t<Func>>>>
52 explicit packaged_task(Func&& function)
53 : state_ptr(_INNER create_task_state<Res(Args...)>(_MSTL forward<Func>(function)))
54 {}
55
62 if (static_cast<bool>(state_ptr) && !state_ptr.unique()) {
63 state_ptr->break_promise(_MSTL move(state_ptr->result_storage));
64 }
65 }
66
67 packaged_task(const packaged_task&) = delete;
68 packaged_task& operator =(const packaged_task&) = delete;
69
74 packaged_task(packaged_task&& other) noexcept {
75 this->swap(other);
76 }
77
83 packaged_task& operator =(packaged_task&& other) noexcept {
84 packaged_task(_MSTL move(other)).swap(*this);
85 return *this;
86 }
87
92 void swap(packaged_task& other) noexcept {
93 state_ptr.swap(other.state_ptr);
94 }
95
100 bool valid() const noexcept {
101 return static_cast<bool>(state_ptr);
102 }
103
110 return future<Res>(state_ptr);
111 }
112
120 void operator ()(Args... args) {
121 _INNER __future_base::state_base::check(state_ptr);
122 state_ptr->run(_MSTL forward<Args>(args)...);
123 }
124
133 void make_ready_at_thread_exit(Args... args) {
134 _INNER __future_base::state_base::check(state_ptr);
135 state_ptr->run_delayed(_MSTL forward<Args>(args)..., state_ptr);
136 }
137
145 void reset() {
146 _INNER __future_base::state_base::check(state_ptr);
147 packaged_task temp;
148 temp.state_ptr = state_ptr;
149 state_ptr = state_ptr->reset();
150 }
151};
152
153#ifdef MSTL_SUPPORT_DEDUCTION_GUIDES__
154template <typename Res, typename... Args>
155packaged_task(Res(*)(Args...)) -> packaged_task<Res(Args...)>;
156
157template <typename Func, typename Sign = typename
158 _INNER __function_guide_helper<decltype(&Func::operator ())>::type>
159packaged_task(Func) -> packaged_task<Sign>;
160#endif
161
162
165
173template <typename BoundFunc, typename Res>
174class __future_base::deferred_state final
175 : public __future_base::state_base {
176private:
177 using PtrType = __future_base::Ptr<basic_result<Res>>;
178
179 PtrType result_storage;
180 BoundFunc function;
181
182 void complete_async() override {
183 state_base::set_result(create_task_setter(result_storage, function), true);
184 }
185
186 bool is_deferred_future() const override {
187 return true;
188 }
189
190public:
191 template <typename... Args>
192 explicit deferred_state(Args&&... args)
193 : result_storage(new basic_result<Res>()),
194 function(_MSTL forward<Args>(args)...) {}
195
196};
197
203class __future_base::async_state_common
204 : public __future_base::state_base {
205protected:
206 _MSTL thread thread;
207 _MSTL once_flag once_flag;
208
209 ~async_state_common() override = default;
210
211 void complete_async() override {
212 join();
213 }
214
215 void join() {
216 _MSTL call_once(once_flag, &_MSTL thread::join, &thread);
217 }
218};
219
227template <typename Func, typename Res>
228class __future_base::async_state_impl final
229 : public __future_base::async_state_common {
230private:
231 using PtrType = __future_base::Ptr<basic_result<Res>>;
232
233 PtrType result_storage;
234 Func function;
235
236 void run() {
237 try {
238 state_base::set_result(__future_base::create_task_setter(result_storage, function));
239 } catch (...) {
240 if (static_cast<bool>(result_storage)) {
241 state_base::break_promise(_MSTL move(result_storage));
242 }
243 throw;
244 }
245 }
246
247public:
248 template <typename... Args>
249 explicit async_state_impl(Args&&... args)
250 : result_storage(new basic_result<Res>()),
251 function(_MSTL forward<Args>(args)...) {
252 thread = _MSTL thread{&async_state_impl::run, this};
253 }
254
255 ~async_state_impl() override {
256 if (thread.joinable()) {
257 thread.join();
258 }
259 }
260};
261
264 // Async
266
268#endif // MSTL_CORE_ASYNC_PACKAGED_TASK_HPP__
函数包装器主模板声明
独占future类模板
packaged_task(Func &&function)
构造函数
packaged_task(const packaged_task &)=delete
禁止拷贝构造
future< Res > get_future()
获取关联的future对象
packaged_task(packaged_task &&other) noexcept
移动构造函数
bool valid() const noexcept
检查任务是否有效
void make_ready_at_thread_exit(Args... args)
在线程退出时标记任务完成
packaged_task() noexcept
默认构造函数
void swap(packaged_task &other) noexcept
交换两个packaged_task对象
共享智能指针类模板
void join()
等待线程结束
MSTL_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
void call_once(once_flag &flag, Callable &&func, Args &&... args)
单次调用函数
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_INNER__
结束inner命名空间
#define _INNER
inner命名空间前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
#define MSTL_BEGIN_INNER__
开始inner命名空间
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result)
移动范围元素
void swap()=delete
删除无参数的swap重载
MSTL异步结果生产者
MSTL线程支持