从线程执行的函数返回一个结构数组

时间:2017-11-27 23:59:23

标签: c++ multithreading c++11

我有一个由函数返回的2个字符串结构数组。 但是这个函数被称为线程的可调用函数的一部分

struct mystruct* myfunc(char* param1, int param2, int param3);

std::thread t1(myfunc, param1, param2, param3);

我从std :: thread文档中了解到myfunc的返回值将被忽略。但我需要这些数据。有没有办法获得这些数据?我读到有类似std :: promise和std :: future之类的东西,但实在无法理解它们是什么。任何人都可以通过一个简单的例子来帮助我实现这个目标吗?

非常感谢,提前。

Esash

1 个答案:

答案 0 :(得分:1)

正如@Fransisco Callego Salido已经说过要做你想要的唯一方法就是使用std :: async,但是要小心std :: async并不能保证你的函数会异步运行。 正如cppreference所说。

  

模板函数async异步运行函数f(可能在一个单独的线程中,它可能是线程池的一部分)并返回一个最终将保存该函数调用结果的std :: future。

为了异步运行myfunc,您必须将另一个参数传递给策略std :: async的构造函数。现在有3个政策

  • std :: launch :: async - 您运行的保证将在新线程上运行。
  • std :: launch :: deferred - 当您决定调用返回的未来的成员函数时,将在当前线程上调用您的函数。
  • std :: launch :: async | std :: launch :: deferred - 由实现决定你的函数是否会在新线程上运行。

要记住的另一件事是,策略总是作为第一个参数传递给std :: async的构造函数,如果你忘记将它传递给std :: launch :: async | std :: launch:将使用延期策略! 因此,为了保证您的函数在新线程上执行,您必须像这样调用它。

std::future<mystruct*> myfunc_future=std::async(std::launch::async, myfunc, param1, param2, param3);
mystruct* myfunc_result=myfunc.get();