Communities

Writing
Writing
Codidact Meta
Codidact Meta
The Great Outdoors
The Great Outdoors
Photography & Video
Photography & Video
Scientific Speculation
Scientific Speculation
Cooking
Cooking
Electrical Engineering
Electrical Engineering
Judaism
Judaism
Languages & Linguistics
Languages & Linguistics
Software Development
Software Development
Mathematics
Mathematics
Christianity
Christianity
Code Golf
Code Golf
Music
Music
Physics
Physics

Dashboard
Notifications
Mark all as read
Q&A

Confusion about using std::async with class member function

+2
−0

So,I'm having a doubt when I call std:async() on a member function of a class. The book I'm reading says (emphasis mine)

You can also pass a pointer to a member function to async(). In that case, the first argument after the member function has to be a reference or a pointer to the object for which the member function gets called:

However, in the example given the object of the class is passed by value, so I thought that perhaps it was a small typo and I decided to tryout myself:

#include <future>
#include <thread>
#include <iostream>


// Example of calling a member functions with std::async()
class X
{
public:
  void add (int num1, int num2)
  {
      int result = num1 + num2;

      std::cout << "The result is " << result << "\n";
  }

};

int main()
{
  X x;
  auto a = std::async(&X::add, x, 42,5); // try call x.add(42,5) asynchronously
//auto a = std::async(&X::add, &x, 42,5); // this works as well
}

It turns out at least on my environment it works if the object is passed by reference and by value. I'm compiling in windows with g++.exe (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0

Also, this answer on stack overflow seems to indicate that the object should only be passed by reference: https://stackoverflow.com/questions/13669094/how-to-use-stdasync-on-a-member-function

Why does this post require moderator attention?
You might want to add some details to your flag.
Why should this post be closed?

0 comments

1 answer

+5
−0

On the cppreference page for std::async, there's an example where the object for a PMF invocation is passed by value. So clearly, that is okay; in fact there is nothing on the cppreference page saying it has to be a reference.

However, in your example, you've only got passing by value (x) and passing by pointer (&x); you can also pass by reference using std::ref(x). Here, I modified your example to show this to better effect:

#include <future>
#include <iostream>
#include <thread>

struct X {
    X() noexcept {
        std::cerr << "X::X()\n";
    }

    X(X const&) noexcept {
        std::cerr << "X::X(X const&)\n";
    }

    ~X() noexcept {
        std::cerr << "X::~X()\n";
    }

    void add(int num1, int num2) noexcept {
        int result = num1 + num2;

        std::cout << "The result is " << result << "\n";
    }
};

int main() {
    X x;
    std::cerr << "\nBy reference:\n";
    std::async(&X::add, std::ref(x), 42, 5).get();
    std::cerr << "\nBy pointer:\n";
    std::async(&X::add, &x, 42, 5).get();
    std::cerr << "\nBy value:\n";
    std::async(&X::add, x, 42, 5).get();
    std::cerr << "\nAll done!\n";
}
Why does this post require moderator attention?
You might want to add some details to your flag.

0 comments

Sign up to answer this question »