#include <thread>
#include <iostream>
class bar {
public:
void foo() {
std::cout << "hello from member function" << std::endl;
}
};
int main()
{
std::thread t(&bar::foo, bar());
t.join();
}
EDYCJA: Uwzględniając swoją edycję, musisz to zrobić w następujący sposób:
std::thread spawn() {
return std::thread(&blub::test, this);
}
AKTUALIZACJA: Chcę wyjaśnić kilka innych kwestii, niektóre z nich zostały również omówione w komentarzach.
Opisana powyżej składnia jest zdefiniowana w kategoriach INVOKE (§20.8.2.1):
Zdefiniuj INVOKE (f, t1, t2, ..., tN) w następujący sposób:
- (t1. * f) (t2, ..., tN), gdy f jest wskaźnikiem funkcji składowej klasy T, a t1 jest obiektem typu T lub odniesieniem do obiektu typu T lub odwołaniem do obiekt typu pochodzący od T;
- ((* t1). * f) (t2, ..., tN), gdy f jest wskaźnikiem funkcji składowej klasy T, a t1 nie jest jednym z typów opisanych w poprzednim punkcie;
- t1. * f gdy N == 1 if jest wskaźnikiem do danych elementu klasy T, a t 1 jest obiektem typu T lub
odniesieniem do obiektu typu T lub odniesieniem do obiektu
typu uzyskanego z T;
- (* t1). * f gdy N == 1 if jest wskaźnikiem do danych elementu klasy T, a t 1 nie jest jednym z typów opisanych w poprzednim punkcie;
- f (t1, t2, ..., tN) we wszystkich pozostałych przypadkach.
Innym ogólnym faktem, na który chcę zwrócić uwagę, jest to, że domyślnie konstruktor wątków kopiuje wszystkie przekazane mu argumenty. Powodem tego jest to, że argumenty mogą potrzebować przeżyć wątek wywołujący, kopiowanie argumentów gwarantuje to. Zamiast tego, jeśli naprawdę chcesz przekazać referencję, możesz użyć std::reference_wrapper
utworzonego przez std::ref
.
std::thread (foo, std::ref(arg1));
Robiąc to, obiecujesz, że zadbasz o to, aby argumenty nadal istniały, gdy wątek na nich działa.
Pamiętaj, że wszystkie wyżej wymienione rzeczy można również zastosować do std::async
i std::bind
.