如何从线程获取返回值?

时间:2019-09-06 06:31:14

标签: c++ multithreading c++11

让我们说一个函数,

int fun(){
    static int a = 10;
    a = a+1;
    return a;
}

上面的函数返回一个整数值,

//Without thread obtaining return value
#include<iostream>
int main()
{
    int var = 0;
    var = fun();
    std::cout << "The value " << value << std::endl;
    return 0;
}

当C ++ 11线程调用

时,现在有任何可能的方法来获取返回值。
//Using thread
#include<iostream>
#include<thread>
int main()
{
    std::thread t1(fun);//Invoking thread
    //How to obtain the return value of the thread ?
    return 0;
}

谢谢!

3 个答案:

答案 0 :(得分:4)

您可能要考虑使用std::async()

auto res = std::async(fun);
std::cout << res.get() << '\n';

答案 1 :(得分:1)

您可以使用async(承诺的未来(双关语意)或打包的任务)。

// future from a packaged_task
std::packaged_task<int()> task(fun); // wrap the function
std::future<int> f1 = task.get_future();  // get a future
std::thread(std::move(task)).detach(); // launch on a thread

// future from an async()
std::future<int> f2 = std::async(std::launch::async, fun);

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


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

答案 2 :(得分:0)

否,std::thread只是一个简单的C ++包装器,它允许启动OS执行线程并等待其完成。

要与调用线程共享返回值,可以手动为线程提供共享状态,也可以使用更高级别的工具,例如packaged_taskfuture等。