2
0
mirror of https://github.com/boostorg/fiber.git synced 2026-02-19 02:12:24 +00:00
Files
fiber/doc/packaged_task.qbk
Nat Goodspeed 3b9e9a3a56 Snapshot of documentation update for 2016 review.
Note effect of BOOST_USE_SEGMENTED_STACKS if StackAllocator is not explicitly
passed.

Introduce function_heading_for QuickBook template to allow separate
descriptions of swap(fiber), swap(packaged_task) and swap(promise).

Document async() using C++14 std::result_of_t and std::decay_t, aligning with
std::async() documentation.

Rework when_any / when_all examples to use unbounded_channel throughout, since
we always close() the channel after the first value anyway. bounded_channel
doesn't really add much value here.

Make wait_first_outcome_impl() infer its channel pointer type. That way we can
reuse that function instead of coding a separate wait_all_until_error_impl(),
which differs only in using the nchannel facade instead of directly pushing to
unbounded_channel.

Explain use of std::bind() to bind a lambda.

Use a more nuanced discussion of promise lifetime in write_ec() example
function.

Use condition_variable::wait(lock, predicate) in a couple places in
work_sharing.cpp example.
2016-02-06 23:17:04 -05:00

183 lines
5.2 KiB
Plaintext

[/
Copyright Oliver Kowalke 2013.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt
]
[#class_packaged_task]
[section:packaged_task Template `packaged_task<>`]
A __packaged_task__ wraps a callable target that returns a value so that the
return value can be computed asynchronously.
Conventional usage of `packaged_task<>` is like this:
# Instantiate `packaged_task<>` with template arguments matching the signature
of the callable. Pass the callable to the [link packaged_task_packaged_task
constructor].
# Call [member_link packaged_task..get_future] and capture the returned
[template_link future] instance.
# Launch a [class_link fiber] to run the new `packaged_task<>`, passing any
arguments required by the original callable.
# Call [member_link fiber..detach] on the newly-launched `fiber`.
# At some later point, retrieve the result from the `future<>`.
This is, in fact, pretty much what [ns_function_link fibers..async]
encapsulates.
template< class R, typename ... Args >
class packaged_task< R( Args ... ) > {
public:
packaged_task() noexcept;
template< typename Fn >
explicit packaged_task( Fn &&);
template< typename Fn, typename Allocator >
packaged_task( std::allocator_arg_t, Allocator const&, Fn &&);
packaged_task( packaged_task &&) noexcept;
packaged_task & operator=( packaged_task &&) noexcept;
packaged_task( packaged_task const&) = delete;
packaged_task & operator=( packaged_task const&) = delete;
~packaged_task();
void swap( packaged_task &) noexcept;
bool valid() const noexcept;
future< R > get_future();
void operator()( Args ...);
void reset();
};
template< typename Signature >
void swap( packaged_task< Signature > &, packaged_task< Signature > &) noexcept;
[heading Default constructor `packaged_task()`]
packaged_task() noexcept;
[variablelist
[[Effects:] [Constructs an object of class `packaged_task` with no [link
shared_state shared state].]]
[[Throws:] [Nothing.]]
]
[#packaged_task_packaged_task]
[heading Templated constructor `template<> packaged_task()`]
template< typename Fn >
explicit packaged_task( Fn && fn);
template< typename Fn, typename Allocator >
packaged_task( std::allocator_arg_t, Allocator const& alloc, Fn && fn);
[variablelist
[[Effects:] [Constructs an object of class `packaged_task` with a [link
shared_state shared state] and stores the callable target `fn` internally.]]
[[Throws:] [Exceptions caused by memory allocation.]]
[[Note:] [The signature of `Fn` should have a return type convertible to `R`.]]
[[See also:] [__allocator_arg_t__]]
]
[heading Move constructor]
packaged_task( packaged_task && other) noexcept;
[variablelist
[[Effects:] [Creates a packaged_task by moving the [link shared_state shared
state] from `other`.]]
[[Postcondition:] [`other` contains no valid shared state.]]
[[Throws:] [Nothing.]]
]
[heading Destructor]
~packaged_task();
[variablelist
[[Effects:] [Destroys `*this` and abandons the [link shared_state shared
state] if shared state is ready; otherwise stores __future_error__ with error
condition __broken_promise__.]]
]
[operator_heading packaged_task..operator_assign..operator=]
packaged_task & operator=( packaged_task && other) noexcept;
[variablelist
[[Effects:] [Transfers the ownership of [link shared_state shared state] to
`*this`.]]
[[Postcondition:] [`other` contains no valid shared state.]]
[[Throws:] [Nothing.]]
]
[member_heading packaged_task..swap]
void swap( packaged_task & other) noexcept;
[variablelist
[[Effects:] [Swaps the [link shared_state shared state] between other and
`*this`.]]
[[Throws:] [Nothing.]]
]
[member_heading packaged_task..valid]
bool valid() const noexcept;
[variablelist
[[Effects:] [Returns `true` if `*this` contains a [link shared_state shared
state].]]
[[Throws:] [Nothing.]]
]
[member_heading packaged_task..get_future]
future< R > get_future();
[variablelist
[[Returns:] [A __future__ with the same [link shared_state shared state].]]
[[Throws:] [__future_error__ with __already_retrieved__ or __no_state__.]]
]
[operator_heading packaged_task..operator_apply..operator()]
void operator()( Args && ... args);
[variablelist
[[Effects:] [Invokes the stored callable target. Any exception thrown by the
callable target `fn` is stored in the [link shared_state shared state].
Otherwise, the value returned by `fn` is stored in the shared state.]]
[[Throws:] [__future_error__ with __no_state__.]]
]
[member_heading packaged_task..reset]
void reset();
[variablelist
[[Effects:] [Resets the [link shared_state shared state] and abondons the
result of previous executions. A new shared state is constructed.]]
[[Throws:] [__future_error__ with __no_state__.]]
]
[function_heading_for swap..packaged_task]
template< typename Signature >
void swap( packaged_task< Signature > & l, packaged_task< Signature > & r) noexcept;
[variablelist
[[Effects:] [Same as `l.swap( r)`.]]
]
[endsect]