#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: contabilizando sua edição, você deve fazer assim:
std::thread spawn() {
return std::thread(&blub::test, this);
}
ATUALIZAÇÃO: Quero explicar mais alguns pontos, alguns deles também foram discutidos nos comentários.
A sintaxe descrita acima é definida em termos da definição INVOKE (§20.8.2.1):
Defina INVOKE (f, t1, t2, ..., tN) da seguinte maneira:
- (t1. * f) (t2, ..., tN) quando f é um ponteiro para uma função membro de uma classe T e t1 é um objeto do tipo T ou uma referência a um objeto do tipo T ou uma referência a um objeto de um tipo derivado de T;
- ((* t1). * f) (t2, ..., tN) quando f é um ponteiro para uma função membro de uma classe T e t1 não é um dos tipos descritos no item anterior;
- t1. * f quando N == 1 ef é um ponteiro para dados de membros de uma classe T e t 1 é um objeto do tipo T ou uma
referência a um objeto do tipo T ou uma referência a um objeto de um
tipo derivado de T;
- (* t1). * f quando N == 1 ef é um ponteiro para dados de membros de uma classe T e t 1 não é um dos tipos descritos no item anterior;
- f (t1, t2, ..., tN) em todos os outros casos.
Outro fato geral que quero destacar é que, por padrão, o construtor de threads copia todos os argumentos passados para ele. A razão para isso é que os argumentos podem precisar sobreviver ao segmento de chamada, copiar os argumentos garante isso. Em vez disso, se você quiser realmente passar uma referência, poderá usar um std::reference_wrapper
criado por std::ref
.
std::thread (foo, std::ref(arg1));
Ao fazer isso, você promete que garantirá que os argumentos ainda existam quando o encadeamento operar neles.
Observe que todas as coisas mencionadas acima também podem ser aplicadas a std::async
e std::bind
.