C ++中类成员的类和std :: async

时间:2012-08-01 11:38:44

标签: c++ c++11

我正在尝试编写一个类成员,它可以多次并行调用另一个类成员。

我写了一个简单的问题示例,甚至无法编译。调用std :: async我做错了什么?我想问题就在于我如何传递函数。

#include <vector>
#include <future>
using namespace std;
class A
{

int a,b;
public: 
A(int i=1, int j=2){ a=i; b=j;} 

std::pair<int,int> do_rand_stf(int x,int y)
{
    std::pair<int,int> ret(x+a,y+b);
    return ret;
}

void run()
{
    std::vector<std::future<std::pair<int,int>>> ran;
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<2;j++)
        {
            auto hand=async(launch::async,do_rand_stf,i,j);
            ran.push_back(hand);    
        }
    }
    for(int i=0;i<ran.size();i++)
    {
        pair<int,int> ttt=ran[i].get();
        cout << ttt.first << ttt.second << endl;
    } 
}
};
int main()
{
A a;
a.run();
}

汇编:

g++ -std=c++11 -pthread main.cpp 

2 个答案:

答案 0 :(得分:48)

do_rand_stf是一个非静态成员函数,因此在没有类实例(隐式this参数)的情况下无法调用。)幸运的是,std::async处理其参数如std::bind而且bind反过来可以使用std::mem_fn将成员函数指针转换为带有明确this参数的仿函数,所以您需要做的只是传递{{1}调用this并在传递std::async时使用有效的成员函数指针语法:

do_rand_stf

但是代码中还有其他问题。首先,您使用auto hand=async(launch::async,&A::do_rand_stf,this,i,j); std::cout而不std::endl #include <iostream>。更严重的是,std::future不可复制,只能移动,因此如果不使用push_back,则无法hand命名对象std::move。或者,只需将async结果直接传递给push_back

ran.push_back(async(launch::async,&A::do_rand_stf,this,i,j));

答案 1 :(得分:2)

您可以将this指针传递给新主题:

async([this]()
{
    Function(this);
});