#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();
}
EDITAR: Contabilizando su edición, debe hacerlo así:
std::thread spawn() {
return std::thread(&blub::test, this);
}
ACTUALIZACIÓN: Quiero explicar algunos puntos más, algunos de ellos también se han discutido en los comentarios.
La sintaxis descrita anteriormente se define en términos de la definición de INVOCACIÓN (§20.8.2.1):
Defina INVOKE (f, t1, t2, ..., tN) de la siguiente manera:
- (t1. * f) (t2, ..., tN) cuando f es un puntero a una función miembro de una clase T y t1 es un objeto de tipo T o una referencia a un objeto de tipo T o una referencia a un objeto de un tipo derivado de T;
- ((* t1). * f) (t2, ..., tN) cuando f es un puntero a una función miembro de una clase T y t1 no es uno de los tipos descritos en el elemento anterior;
- t1. * f cuando N == 1 yf es un puntero a datos de miembros de una clase T y t 1 es un objeto de tipo T o una
referencia a un objeto de tipo T o una referencia a un objeto de un
tipo derivado de T;
- (* t1). * f cuando N == 1 yf es un puntero a datos de miembros de una clase T y t 1 no es uno de los tipos descritos en el elemento anterior;
- f (t1, t2, ..., tN) en todos los demás casos.
Otro hecho general que quiero señalar es que, por defecto, el constructor de hilos copiará todos los argumentos que se le hayan pasado. La razón de esto es que los argumentos pueden necesitar sobrevivir al hilo de la llamada, copiar los argumentos garantiza eso. En cambio, si realmente quieres pasar una referencia, puedes usar una std::reference_wrapper
creada por std::ref
.
std::thread (foo, std::ref(arg1));
Al hacer esto, usted promete que se encargará de garantizar que los argumentos seguirán existiendo cuando el hilo opere en ellos.
Tenga en cuenta que todas las cosas mencionadas anteriormente también se pueden aplicar a std::async
y std::bind
.