Confusion about using std::async with class member function
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
1 answer
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";
}
0 comment threads