41

如何对成员函数进行 std::async 调用?

例子:

class Person{
public:
    void sum(int i){
        cout << i << endl;
    }
};

int main(int argc, char **argv) {
    Person person;
    async(&Person::sum,&person,4);
}

我想打电话来总结异步。

Person p;
call async to p.sum(xxx)

我不知道我是否可以用 std::async 做到这一点。不想使用升压。寻找单行异步调用方式。

4

2 回答 2

48

像这样的东西:

auto f = std::async(&Person::sum, &p, xxx);

或者

auto f = std::async(std::launch::async, &Person::sum, &p, xxx);

wherep是一个Person实例并且xxx是一个int.

这个简单的演示适用于 GCC 4.6.3:

#include <future>
#include <iostream>

struct Foo
{
  Foo() : data(0) {}
  void sum(int i) { data +=i;}
  int data;
};

int main()
{
  Foo foo;
  auto f = std::async(&Foo::sum, &foo, 42);
  f.get();
  std::cout << foo.data << "\n";
}
于 2012-12-02T12:04:05.530 回答
20

有几种方法,但我发现使用 lambda 是最清楚的,如下所示:

int i=42;
Person p;
auto theasync=std::async([&p,i]{ return p.sum(i);});

这将创建一个std::future. 对于一个完整的例子,我有一个完整的例子,包括一个可以异步的 mingw 设置:

http://scrupulousabstractions.tumblr.com/post/36441490955/eclipse-mingw-builds

您需要确保 p 是线程安全的,并且 &p 引用在加入异步之前有效。(您也可以使用共享指针保存 p,或者在 c++14 中,使用 unique_ptr 甚至将 p 移动到 lambda 中。)

于 2012-12-02T12:05:26.733 回答