Agradecemos tu apoyo para compartir nuestras secciones en referencia a las ciencias informáticas.
Solución:
Inicializar explícitamente el subproceso con un reference_wrapper
mediante el uso std::ref
:
auto thread1 = std::thread(SimpleThread, std::ref(a));
(o std::cref
en lugar de std::ref
, según sea apropiado). Según notas de cppreference en std:thread
:
Los argumentos de la función de subproceso se mueven o copian por valor. Si es necesario pasar un argumento de referencia a la función de subproceso, debe ajustarse (por ejemplo, con
std::ref
ostd::cref
).
Basado en este comentario, esta respuesta explica la razón por la cual los argumentos no se pasan por referencia a la función de hilo por defecto.
Considere la siguiente función SimpleThread()
:
void SimpleThread(int& i)
std::this_thread::sleep_for(std::chrono::seconds1);
i = 0;
Ahora, imagina lo que podría pasar si el siguiente código compilado (lo hace no compilar):
int main()
int a;
std::thread th(SimpleThread, a);
th.detach();
// "a" is out of scope
// at this point the thread may be still running
// ...
El argumento a
sería pasado por referencia a SimpleThread()
. El hilo aún puede estar durmiendo en la función. SimpleThread()
después de la variable a
ya ha salido del alcance y su vida útil ha terminado. En ese caso, i
en SimpleThread()
en realidad sería un referencia colgantey la tarea i = 0
resultaría en comportamiento indefinido.
Al envolver argumentos de referencia con la plantilla de clase std::reference_wrapper
(utilizando las plantillas de funciones std::ref
y std::cref
) usted expresa explícitamente sus intenciones.