NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
packaged_task.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_ASYNC_PACKAGED_TASK_HPP__
2#define NEFORCE_CORE_ASYNC_PACKAGED_TASK_HPP__
3
11
14NEFORCE_BEGIN_NAMESPACE__
15
21
27
35template <typename Res, typename... Args>
36class packaged_task<Res(Args...)> {
37 using StateType = inner::__future_base::task_state_base<Res(Args...)>;
38
39 shared_ptr<StateType> state_ptr;
40
41public:
47 packaged_task() noexcept {}
48
57 template <typename Func, typename = enable_if_t<!is_same_v<packaged_task, remove_cvref_t<Func>>>>
58 explicit packaged_task(Func&& function) :
59 state_ptr(inner::create_task_state<Res(Args...)>(_NEFORCE forward<Func>(function))) {}
60
67 if (static_cast<bool>(state_ptr) && !state_ptr.unique()) {
68 state_ptr->break_promise(_NEFORCE move(state_ptr->result_storage));
69 }
70 }
71
72 packaged_task(const packaged_task&) = delete;
74
79 packaged_task(packaged_task&& other) noexcept { this->swap(other); }
80
87 packaged_task(_NEFORCE move(other)).swap(*this);
88 return *this;
89 }
90
95 void swap(packaged_task& other) noexcept { state_ptr.swap(other.state_ptr); }
96
101 bool valid() const noexcept { return static_cast<bool>(state_ptr); }
102
108 future<Res> get_future() { return future<Res>(state_ptr); }
109
117 void operator()(Args... args) {
118 inner::__future_base::state_base::check(state_ptr);
119 state_ptr->run(_NEFORCE forward<Args>(args)...);
120 }
121
130 void make_ready_at_thread_exit(Args... args) {
131 inner::__future_base::state_base::check(state_ptr);
132 state_ptr->run_delayed(_NEFORCE forward<Args>(args)..., state_ptr);
133 }
134
142 void reset() {
143 inner::__future_base::state_base::check(state_ptr);
144 packaged_task temp;
145 temp.state_ptr = state_ptr;
146 state_ptr = state_ptr->reset();
147 }
148};
149
150#ifdef NEFORCE_STANDARD_17
151template <typename Res, typename... Args>
152packaged_task(Res (*)(Args...)) -> packaged_task<Res(Args...)>;
153
154template <typename Func, typename Sign = typename inner::__function_guide_helper<decltype(&Func::operator())>::type>
155packaged_task(Func) -> packaged_task<Sign>;
156#endif
157
158
160NEFORCE_BEGIN_INNER__
161
169template <typename BoundFunc, typename Res>
170class __future_base::deferred_state final : public __future_base::state_base {
171private:
172 using PtrType = __future_base::Ptr<basic_result<Res>>;
173
174 PtrType result_storage;
175 BoundFunc function;
176
177 void complete_async() override { state_base::set_result(create_task_setter(result_storage, function), true); }
178
179 bool is_deferred_future() const override { return true; }
180
181public:
182 template <typename... Args>
183 explicit deferred_state(Args&&... args) :
184 result_storage(new basic_result<Res>()),
185 function(_NEFORCE forward<Args>(args)...) {}
186};
187
193class __future_base::async_state_common : public __future_base::state_base {
194protected:
195 _NEFORCE thread thread;
196 _NEFORCE once_flag once_flag;
197
198 ~async_state_common() override = default;
199
200 void complete_async() override { join(); }
201
202 void join() { _NEFORCE call_once(once_flag, &_NEFORCE thread::join, &thread); }
203};
204
212template <typename Func, typename Res>
213class __future_base::async_state_impl final : public __future_base::async_state_common {
214private:
215 using PtrType = __future_base::Ptr<basic_result<Res>>;
216
217 PtrType result_storage;
218 Func function;
219
220 void run() {
221 try {
222 state_base::set_result(__future_base::create_task_setter(result_storage, function));
223 } catch (...) {
224 if (static_cast<bool>(result_storage)) {
225 state_base::break_promise(_NEFORCE move(result_storage));
226 }
227 throw;
228 }
229 }
230
231public:
232 template <typename... Args>
233 explicit async_state_impl(Args&&... args) :
234 result_storage(new basic_result<Res>()),
235 function(_NEFORCE forward<Args>(args)...) {
236 thread = _NEFORCE thread{&async_state_impl::run, this};
237 }
238
239 ~async_state_impl() override {
240 if (thread.joinable()) {
241 thread.join();
242 }
243 }
244};
245
246NEFORCE_END_INNER__
248 // Async
250 // AsyncComponents
252
253NEFORCE_END_NAMESPACE__
254#endif // NEFORCE_CORE_ASYNC_PACKAGED_TASK_HPP__
函数包装器主模板声明
独占future类模板
packaged_task(Func &&function)
构造函数
packaged_task & operator=(const packaged_task &)=delete
禁止拷贝赋值
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对象
packaged_task & operator=(packaged_task &&other) noexcept
移动赋值运算符
void operator()(Args... args)
执行任务
共享智能指针类模板
void join()
等待线程结束
NEFORCE_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
void call_once(once_flag &flag, Callable &&func, Args &&... args)
单次调用函数
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
void swap()=delete
删除无参数的swap重载
异步结果生产者
线程管理类