(1) En código C++, usando return
hace que la pila se desenrolle y las variables locales se destruyan, mientras que pthread_exit
solo se garantiza que invoque controladores de cancelación registrados con pthread_cancel_push()
. En algunos sistemas, este mecanismo también hará que se llame a los destructores para las variables locales de C++, pero esto no está garantizado para el código portátil --- consulte la documentación de su plataforma.
Además, en main()
, return
llamará implícitamente a exit()
, y así terminar el programa, mientras que pthread_exit()
simplemente terminará el subproceso, y el programa seguirá ejecutándose hasta que todos los subprocesos hayan terminado o algunos subprocesos llamen a exit()
, abort()
u otra función que termine el programa.
(2) El uso de return
funciona porque la especificación POSIX lo dice. El valor devuelto se almacena en un lugar donde pthread_join()
puede recuperarlo. Los recursos utilizados por el subproceso no se reclaman hasta pthread_join()
se llama.
(3) Nunca uso el valor de retorno de un subproceso en subprocesos POSIX sin procesar. Sin embargo, tiendo a usar funciones de nivel superior, como la biblioteca de subprocesos Boost y, más recientemente, la biblioteca de subprocesos C++ 0x, que proporcionan medios alternativos para transferir valores entre subprocesos, como futuros, que evitan los problemas asociados con la administración de memoria que usted aludir a.
Creo que return
del start_routine
es preferible, porque garantiza que la pila de llamadas se desenrolle correctamente.
Esto es incluso más importante para C que para C++, ya que no tiene la magia del destructor que limpia el desorden después de las salidas preliminares. Entonces, su código debe pasar por todas las partes finales de las rutinas en la pila de llamadas para hacer free
s y similares.
Por qué esto funciona, esto es simple
Si start_routine regresa, el efecto será como si hubiera una llamada implícita a pthread_exit() usando el valor de retorno de start_routine como el estado de salida
Por mi experiencia personal, tiendo a no usar mucho el estado de subprocesos terminados. Esta es la razón por la que a menudo tengo hilos iniciados detached
. Pero esto debería depender mucho de la aplicación y ciertamente no es generalizable.