When should I use std::promise
over std::async
or std::packaged_task
?
Can you give me practical examples of when to use each one of them?
相关问题
- Sorting 3 numbers without branching [closed]
- How to compile C++ code in GDB?
- void before promise syntax
- Keeping track of variable instances
- Why does const allow implicit conversion of refere
相关文章
- Class layout in C++: Why are members sometimes ord
- How to mock methods return object with deleted cop
- Which is the best way to multiply a large and spar
- C++ default constructor does not initialize pointe
- Selecting only the first few characters in a strin
- What exactly do pointers store? (C++)
- Converting glm::lookat matrix to quaternion and ba
- What is the correct way to declare and use a FILE
std::async
std::async
is a neat and easy way to get astd::future
, but:It does not always it start a new thread; pass
std::launch::async
as a first parameter to force it.The
std::~future
destructor can block until the new thread finishesNormally we expect that only
.get()
or.wait()
blocks, but for astd::future
returned fromstd::async
, the destructor also may block, so be careful not to block your main thread just by forgetting about it.If the
std::future
is stored in a temporary-life object, thestd::async
call will block immediately, so the following block will take 10 seconds if you remove theauto f =
initializations:std::packaged_task
std::packaged_task
by itself has nothing to do with threads: it is just a functor and a relatedstd::future
. Consider the following:Here we just run the task by
package(1)
, and after it returns,f
is ready so no blocking on.get()
.There is a feature of
std::packaged_task
that makes it very useful for threads. Instead of just a function, you can initializestd::thread
with astd::packaged_task
which gives a really nice way of getting to the 'std::future'. Consider the following:Because
std::packaged_task
is not copyable, you must move it to new thread withstd::move
.std::promise
std::promise
is a powerful mechanism. For example, you can pass a value to new thread without need of any additional synchronization.New thread will wait for us on
.get()
So, in general, answering your question:
std::async
only for simple things, e.g. to make some call non-blocking, but bear in mind the comments on blocking above.Use
std::packaged_task
to easily get to astd::future
, and run it as a separate threador
Use
std::promise
when you need more control over the future.See also
std::shared_future
and on passing exceptions between threadsstd::promise::set_exception
A promise is used to store a value that was calculated using e.g. a std::async. See http://en.cppreference.com/w/cpp/thread/promise
I can imagine you wonder about the difference between std::packaged_task and std::async (in the most common approach, std::async starts a separate thread NOW to run function/lambda/etc with a (likely) expensive calculation. A std::packaged_task is used to wrap a function/lambda/etc with the current values of arguments so you can LATER run it, either synchronously or in a separate thread).
Both std::packaged_task and std::async provide a std::future that will contain the RESULT of the wrapped function/lambda/etc once run. Internally, the std::future uses a std::promise to hold that result.