Saltar al contenido

¿Qué es diferente entre join() y detach() para subprocesos múltiples en C++?

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();

Te mostramos comentarios y valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *