Подтвердить что ты не робот

Как использовать std:: async для функции-члена?

Как я могу использовать вызов 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);
}

Я хочу позвонить, чтобы суммировать async.

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

Я не понял, могу ли я сделать это с помощью std:: async. Не хотите использовать boost. Поиск однострочного асинхронного вызова.

4b9b3361

Ответ 1

Что-то вроде этого:

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

или

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

где 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";
}

Ответ 2

Есть несколько способов, но я считаю наиболее ясным использование лямбда, например:

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 с общим указателем или в С++ 14, unique_ptr или даже перемещать p в лямбда.)