在c ++中使用返回值同时调用多个函数

时间:2015-06-18 13:02:49

标签: c++ multithreading c++11 multiprocessing future

我是C / C ++的新手。我试图用返回值调用2个函数。我做了一些研究,我开始知道线程不适合这个,因为很难通过线程获得返回值。我正在使用未来的库与异步,但它不是一次调用多个函数(我已经用sleep()测试它,我看到它等待其他函数完成以获取返回值)。请查找代码在这里,有些人可以通过展示一个简单的代码来帮助我吗?

#include <iostream>      
#include <future>
#include <windows.h>
#include <string>
using namespace std;

// a non-optimized way of checking for prime numbers:
string test(string t1)
{
    string h = "Hello";
    string hh = h+t1;
    return hh;
}
string test1(string t2)
{
    string hh = "Hello";
    string hhh = hh+t2;
    return hhh;
}
int main ()
{
    string t1 = "Hai test1";
    string t2 = "Hai teset2";
    future<string> stt = async (test,t1);
    future<string> sttt = async (test1,t2);

    string re1 = stt.get();
    string re2 = sttt.get();
    cout << re1 << endl;
    cout << re2 << endl;

    return 0;
}

1 个答案:

答案 0 :(得分:3)

您应该参考一些标准库参考: http://en.cppreference.com/w/cpp/thread/async

正如您所看到的,std :: async有一个重载,需要额外的启动策略。您调用的std :: async存在以下问题:

  

与async相同(std :: launch :: async | std :: launch :: deferred,f,args ...)。换句话说,f可以在另一个线程中执行,或者当查询结果std :: future时,它可以同步运行。

  

如果在策略中设置了std :: launch :: async和std :: launch :: deferred标志,则由实现决定是执行异步执行还是延迟评估。

所以最终它取决于你的编译器会发生什么。 解决方案非常简单:

    future<string> stt = async (launch::async,test,t1);
    future<string> sttt = async (launch::async,test1,t2);

    string re1 = stt.get();
    string re2 = sttt.get();