#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();
}
EDIT: contabilità della tua modifica, devi farlo in questo modo:
std::thread spawn() {
return std::thread(&blub::test, this);
}
AGGIORNAMENTO: Voglio spiegare alcuni punti in più, alcuni di questi sono stati discussi anche nei commenti.
La sintassi sopra descritta è definita in termini di definizione INVOKE (§20.8.2.1):
Definire INVOKE (f, t1, t2, ..., tN) come segue:
- (t1. * f) (t2, ..., tN) quando f è un puntatore a una funzione membro di una classe T e t1 è un oggetto di tipo T o un riferimento a un oggetto di tipo T o un riferimento a un oggetto di un tipo derivato da T;
- ((* t1). * f) (t2, ..., tN) quando f è un puntatore a una funzione membro di una classe T e t1 non è uno dei tipi descritti nell'elemento precedente;
- t1. * f quando N == 1 e f è un puntatore ai dati dei membri di una classe T et 1 è un oggetto di tipo T o un
riferimento a un oggetto di tipo T o un riferimento a un oggetto di un
tipo derivato da T;
- (* t1). * f quando N == 1 e f è un puntatore ai dati dei membri di una classe T et 1 non è uno dei tipi descritti nell'elemento precedente;
- f (t1, t2, ..., tN) in tutti gli altri casi.
Un altro fatto generale che voglio sottolineare è che per impostazione predefinita il costruttore del thread copierà tutti gli argomenti passati ad esso. La ragione di ciò è che gli argomenti potrebbero dover sopravvivere al thread chiamante, copiando gli argomenti lo garantisce. Invece, se vuoi davvero passare un riferimento, puoi usare un std::reference_wrapper
creato da std::ref
.
std::thread (foo, std::ref(arg1));
In questo modo, stai promettendo che ti occuperai di garantire che gli argomenti esistano ancora quando il thread opera su di essi.
Si noti che tutte le cose sopra menzionate possono essere applicate anche a std::async
e std::bind
.