使用C ++ std :: async,我们为什么需要packaged_task和Promise?

时间:2019-03-20 18:59:45

标签: c++ multithreading asynchronous

我正在学习C ++线程库,我觉得async,packaged_task和Promise所做的事情非常相似:它们都在单独的线程中异步运行一个函数,并返回一个将来的对象,该对象存储该函数的返回值值。因此,我不太了解为什么我们需要全部三个,而不是始终使用异步。

以下是std::future documentation中的示例代码:

#include <iostream>
#include <future>
#include <thread>

int main()
{
    // future from a packaged_task
    std::packaged_task<int()> task([]{ return 7; }); // wrap the function
    std::future<int> f1 = task.get_future();  // get a future
    std::thread t(std::move(task)); // launch on a thread

    // future from an async()
    std::future<int> f2 = std::async(std::launch::async, []{ return 8; });

    // future from a promise
    std::promise<int> p;
    std::future<int> f3 = p.get_future();
    std::thread( [&p]{ p.set_value_at_thread_exit(9); }).detach();

    std::cout << "Waiting..." << std::flush;
    f1.wait();
    f2.wait();
    f3.wait();
    std::cout << "Done!\nResults are: "
          << f1.get() << ' ' << f2.get() << ' ' << f3.get() << '\n';
    t.join();
}  

并且此示例至少显示了在某些情况下,std :: async可以替换其他两个。有人可以举个例子,说明我必须使用promise或packaged_task,而其中std :: async不足以完成这项工作吗?

0 个答案:

没有答案