【问题标题】:Is std::packaged_task<T> (Function Template) an std::async (FT) with an invoked function?std::packaged_task<T> (函数模板)是带有调用函数的 std::async (FT)吗?
【发布时间】:2020-09-10 19:29:52
【问题描述】:

尝试与packaged_task&lt;T&gt;合作

std::async 使用类模板std::future&lt;T&gt;get() 方法创建一个异步执行的线程并处理我们可以访问的数据。

我应该知道packaged_task&lt;T&gt; 的工作原理与std::async 的区别?

当我们调用task(x) 函数时,是否创建了与packaged_task&lt;T&gt; 相关的线程?

以代码为例:

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

using namespace std::chrono;

int main()
{

    int x(0),xr(0);

    std::future<int> fdata = std::async(std::launch::async,[&](int data) mutable throw() ->
                                        int
                                        {data++;
                                        std::this_thread::sleep_for(seconds(2));
                                        return data;}
                                        ,x);

    std::packaged_task<int(int)> task([&](int data) mutable throw() ->
                                        int
                                        {data++;
                                        std::this_thread::sleep_for(seconds(2));
                                        return data;}
                                        );
    std::future<int> xrp = task.get_future();

    task(x);

    xr=fdata.get();

    std::cout<<xr<<std::endl;
    std::cout<<xrp.get()<<std::endl;

    return 0;
}

【问题讨论】:

    标签: c++ multithreading asynchronous difference packaged-task


    【解决方案1】:
    std::async(ploicy, callable, args...)
    

    如果策略为std::async::launch,则启动一个新线程(如果资源可用)。

    如果政策没有确定,它可能会启动或不启动。

    如果策略为std::async::deferred,则不会启动。

    std::packaged_task 包装了您的可调用对象,以便可以使用类似的新线程异步调用它

    auto t1 = std::thread(std::move(taskObj), args...);
    ....
    t1.join();
    

    但是,如果您像在示例中那样使用它,它就不会启动新线程。它本身不会启动新线程,但可以用来执行此操作。

    【讨论】:

    猜你喜欢
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2012-05-24
    • 2017-03-31
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多