No dudes en divulgar nuestro espacio y códigos en tus redes, apóyanos para hacer crecer nuestra comunidad.
Solución:
Un C++ thread
El objeto generalmente (pero no siempre) representa un hilo de ejecución, que es un sistema operativo o un concepto de plataforma.
Cuándo thread::join()
se llama, el subproceso de llamada se bloqueará hasta que se complete el subproceso de ejecución. Básicamente, este es un mecanismo que se puede usar para saber cuándo ha terminado un hilo. Cuándo thread::join()
devuelve, el subproceso de ejecución del sistema operativo se ha completado y el C++ thread
el objeto puede ser destruido.
los thread::detach()
se llama, el hilo de ejecución se “separa” del thread
objeto y ya no está representado por un thread
objeto – son dos cosas independientes. El C++ thread
El objeto se puede destruir y el subproceso de ejecución del sistema operativo puede continuar. Si el programa necesita saber cuándo se completó ese hilo de ejecución, se debe usar algún otro mecanismo. join()
no se puede llamar a eso thread
objeto más, ya que ya no está asociado con un hilo de ejecución.
Se considera un error destruir un C++ thread
objeto mientras todavía es “unible”. Es decir, para destruir un C++ thread
objeto cualquiera join()
necesita ser llamado (y completado) o detach()
debe ser llamado Si un C++ thread
el objeto todavía se puede unir cuando se destruye, se lanzará una excepción.
Algunas otras formas en que un C++ thread
el objeto no representará un hilo de ejecución (es decir, no se puede unir):
- Un defecto construido
thread
El objeto no representa un hilo de ejecución, por lo que no se puede unir. - Un subproceso que se ha movido ya no representará un subproceso de ejecución, por lo que no se puede unir.
join()
no mata el hilo. En realidad, espera hasta que regresa la función principal del subproceso. Entonces, si la función principal de su hilo se ve así:
while (true)
join()
va a esperar para siempre.
detatch()
tampoco mata el hilo. en realidad dice std::thread
que este subproceso debería continuar ejecutándose incluso cuando std::thread
el objeto es destruido. C++ verifica en std::thread destructor que el hilo está unido o separado y finaliza el programa si esta verificación falla.
Entonces, si descomentas la primera línea en main
función del siguiente código se bloqueará. Si descomentas la segunda o la tercera línea, funcionará bien.
#include
void func()
void fail1()
std::thread t(func);
// will fail when we try to destroy t since it is not joined or detached
void works1()
std::thread t(func);
t.join();
void works2()
std::thread t(func);
t.detach();
int main()
// fail1();
// works1();
// works2();