#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();
}
BEARBEITEN: Wenn Sie Ihre Bearbeitung berücksichtigen, müssen Sie dies folgendermaßen tun:
std::thread spawn() {
return std::thread(&blub::test, this);
}
UPDATE: Ich möchte noch einige Punkte erläutern, von denen einige auch in den Kommentaren besprochen wurden.
Die oben beschriebene Syntax wird in Bezug auf die INVOKE-Definition (§20.8.2.1) definiert:
Definieren Sie INVOKE (f, t1, t2, ..., tN) wie folgt:
- (t1. * f) (t2, ..., tN) wenn f ein Zeiger auf eine Elementfunktion einer Klasse T ist und t1 ein Objekt vom Typ T oder eine Referenz auf ein Objekt vom Typ T oder eine Referenz auf ein ist Objekt eines von T abgeleiteten Typs;
- ((* t1). * f) (t2, ..., tN) wenn f ein Zeiger auf eine Mitgliedsfunktion einer Klasse T ist und t1 nicht zu den im vorherigen Punkt beschriebenen Typen gehört;
- t1. * f, wenn N == 1 und f ein Zeiger auf Mitgliedsdaten einer Klasse T ist und t 1 ein Objekt vom Typ T oder eine
Referenz auf ein Objekt vom Typ T oder eine Referenz auf ein Objekt eines von
abgeleiteten Typs ist T;
- (* t1). * f wenn N == 1 und f ein Zeiger auf Mitgliedsdaten einer Klasse T ist und t 1 nicht einer der im vorherigen Punkt beschriebenen Typen ist;
- f (t1, t2, ..., tN) in allen anderen Fällen.
Eine weitere allgemeine Tatsache, auf die ich hinweisen möchte, ist, dass der Thread-Konstruktor standardmäßig alle an ihn übergebenen Argumente kopiert. Der Grund dafür ist, dass die Argumente möglicherweise den aufrufenden Thread überleben müssen. Das Kopieren der Argumente garantiert dies. Stattdessen, wenn Sie wirklich wollen , um eine Referenz zu übergeben, können Sie ein verwenden std::reference_wrapper
erstellt std::ref
.
std::thread (foo, std::ref(arg1));
Auf diese Weise versprechen Sie, dass Sie sicherstellen, dass die Argumente weiterhin vorhanden sind, wenn der Thread sie bearbeitet.
Beachten Sie, dass alle oben genannten Dinge auch auf std::async
und angewendet werden können std::bind
.