#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: Bei der Buchhaltung müssen Sie wie folgt vorgehen:
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 diskutiert wurden.
Die oben beschriebene Syntax ist im Sinne der INVOKE-Definition (§ 20.8.2.1) definiert:
Definieren Sie INVOKE (f, t1, t2, ..., tN) wie folgt:
- (t1.*f)(t2, ..., tN) wenn f ein po ist Typs T oder ein Verweis auf ein Objekt eines von T abgeleiteten Typs ist;
- ((*t1).*f)(t2, ..., tN), wenn f ein Zeiger auf eine Mitgliedsfunktion einer Klasse T ist und t1 nicht zu den im vorhergehenden Punkt beschriebenen Typen gehört Punkt beschriebenen Typen ist;
- t1.*f, wenn N == 1 und f ein Zeiger auf Mitgliedsdaten einer Klasse T ist und t 1 ein Objekt vom Typ T oder ein
Verweis auf ein Objekt des Typs T oder ein Verweis auf ein Objekt des Typs
Typ abgeleitet von T;
- (*t1).*f, wenn N == 1 und f ein Zeiger auf Mitgliedsdaten einer Klasse T ist und t 1 nicht zu den im vorherigen Punkt beschriebenen Typen gehört;
- 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 den aufrufenden Thread möglicherweise überleben müssen, und das Kopieren der Argumente garantiert dies. Wenn Sie stattdessen wirklich eine Referenz übergeben wollen, können Sie eine std::reference_wrapper
erstellt von std::ref
.
std::thread (foo, std::ref(arg1));
Auf diese Weise versprechen Sie, dass Sie dafür sorgen, dass die Argumente noch existieren, wenn der Thread sie bearbeitet.
Beachten Sie, dass alle oben genannten Punkte auch für folgende Bereiche gelten std::async
y std::bind
.