如何在成员函数上使用std :: async?

Avi*_*ano 27 c++ multithreading std c++11

如何在成员函数上运行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);
}
Run Code Online (Sandbox Code Playgroud)

我想调用sum async.

Person p;
call async to p.sum(xxx)
Run Code Online (Sandbox Code Playgroud)

我没弄明白我是否能用std :: async做到这一点.不想使用提升.寻找一线异步呼叫方式.

jua*_*nza 30

像这样的东西:

auto f = std::async(&Person::sum, &p, xxx);
Run Code Online (Sandbox Code Playgroud)

要么

auto f = std::async(std::launch::async, &Person::sum, &p, xxx);
Run Code Online (Sandbox Code Playgroud)

在哪里p是一个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";
}
Run Code Online (Sandbox Code Playgroud)

  • &amp; 对于成员函数是必需的,但对于自由函数是可选的。 (2认同)

Joh*_*erg 17

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

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

这创造了一个std::future.有关此的完整示例,我有一个完整的示例,包括mingw的异步功能设置:

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

您需要确保p是线程安全的,并且&p引用有效,直到连接异步.(您也可以使用共享指针保存p,或者使用c ++ 14,使用unique_ptr或者将p移动到lambda中.)