Estoy tratando de construir una función std::thread
con un miembro que no tome argumentos y devuelva void
. No puedo entender ninguna sintaxis que funcione: el compilador se queja sin importar qué. ¿Cuál es la forma correcta de implementar spawn()
para que devuelva un std::thread
que se ejecuta test()
?
#include <thread>
class blub {
void test() {
}
public:
std::thread spawn() {
return { test };
}
};
c++
multithreading
c++11
Abergmeier
fuente
fuente
std::move( std::thread(func) );
es mejor, porquestd::thread
no tiene un constructor de copias.std::move
es redundante en este caso; si esto no fuera cierto y no hubiera un constructor de copia, el compilador daría un error de todos modos.Respuestas:
EDITAR: Contabilizando su edición, debe hacerlo así:
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):
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 porstd::ref
.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
ystd::bind
.fuente
std::thread
constructor funciona como si se pasaran los argumentosstd::bind
. Para llamar a una función miembro, el primer argumentostd::bind
debe ser un puntero, una referencia o un puntero compartido a un objeto del tipo apropiado.bind
? No puedo encontrar eso en ningún lado.Como está utilizando C ++ 11, la expresión lambda es una solución agradable y limpia.
ya que
this->
puede omitirse, podría acortarse para:o solo
fuente
std::move
al devolver una variable local por valor. Esto realmente inhibe RVO. Si solo regresa por valor (sin el movimiento), el compilador puede usar RVO, y si no lo hace, el estándar dice que tiene que invocar la semántica de movimiento.[=]
. Con eso puedes inadvertidamente copiar un objeto enorme. En general, es un código de olor para usar[&]
o[=]
.[&]
), puede introducir errores como algunas referencias colgantes. (Por ejemplostd::thread spawn() { int i = 10; return std::thread( [&] { std::cout<<i<<"\n"; } ); }
)Aquí hay un ejemplo completo
Compilar con g ++ produce el siguiente resultado
fuente
delete
la memoria del montón :)@ hop5 y @RnMss sugirieron usar lambdas de C ++ 11, pero si manejas punteros, puedes usarlos directamente:
salidas
La muestra reescrita de esta respuesta sería entonces:
fuente
Algunos usuarios ya dieron su respuesta y la explicaron muy bien.
Me gustaría agregar algunas cosas más relacionadas con el hilo.
Cómo trabajar con functor e hilo. Por favor, consulte el siguiente ejemplo.
El hilo hará su propia copia del objeto al pasar el objeto.
Otra forma de lograr lo mismo es como:
Pero si desea pasar el objeto por referencia, utilice la siguiente sintaxis:
fuente