#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: Pour comptabiliser votre montage, vous devez le faire comme ceci:
std::thread spawn() {
return std::thread(&blub::test, this);
}
MISE À JOUR: Je veux expliquer quelques points supplémentaires, certains d'entre eux ont également été discutés dans les commentaires.
La syntaxe décrite ci-dessus est définie en fonction de la définition INVOKE (§20.8.2.1):
Définissez INVOKE (f, t1, t2, ..., tN) comme suit:
- (t1. * f) (t2, ..., tN) lorsque f est un pointeur vers une fonction membre d'une classe T et t1 est un objet de type T ou une référence à un objet de type T ou une référence à un objet d'un type dérivé de T;
- ((* t1). * f) (t2, ..., tN) lorsque f est un pointeur vers une fonction membre d'une classe T et t1 n'est pas l'un des types décrits dans l'article précédent;
- t1. * f lorsque N == 1 et f est un pointeur vers les données de membre d'une classe T et t 1 est un objet de type T ou une
référence à un objet de type T ou une référence à un objet d'un
type dérivé de T;
- (* t1). * f lorsque N == 1 et f est un pointeur vers des données de membre d'une classe T et t 1 n'est pas l'un des types décrits dans l'article précédent;
- f (t1, t2, ..., tN) dans tous les autres cas.
Un autre fait général que je veux souligner est que par défaut le constructeur de thread copiera tous les arguments qui lui sont passés. La raison en est que les arguments peuvent avoir besoin de survivre au thread appelant, la copie des arguments le garantit. Au lieu de cela, si vous voulez vraiment passer une référence, vous pouvez utiliser un std::reference_wrapper
créé par std::ref
.
std::thread (foo, std::ref(arg1));
En faisant cela, vous promettez de prendre soin de garantir que les arguments existeront toujours lorsque le thread les opèrera.
Notez que toutes les choses mentionnées ci-dessus peuvent également être appliquées à std::async
et std::bind
.