2012-04-09 17 views
12

En C++ usando pthreads, ¿qué pasa con tus otros hilos si uno de tus subprocesos llama fork?¿Qué sucede con otros hilos cuando un hilo se bifurca()?

Parece que los hilos no siguen. En mi caso, estoy tratando de crear un daemon y utilizo fork() con el padre que sale para desamonizarlo. Sin embargo, en una nueva ruta a través del código, creo algunos hilos antes del tenedor y algunos después. ¿Existe alguna manera fácil de cambiar la propiedad de los hilos al nuevo proceso bifurcado en lugar de mover toda la creación de mi hilo después del tenedor?

+0

Como ya habrán dado cuenta por ahora, esta es una muy mala idea. Si tiene este tipo de inquietudes en una aplicación real, le sugiero que averigüe la razón por la que debe hacer eso, descubra cómo hacerlo de la manera correcta y realice una refactorización adecuada: D – Dacav

Respuesta

18

Nada. Solo el hilo que llama fork() obtiene duplicado. El proceso secundario debe iniciar cualquier nuevo hilo. Los hilos de los padres se quedan solos.

+1

¿Qué sucede con los hilos cuando el padre de la salida de horquilla() s? – WilliamKF

+0

@WilliamKF http://stackoverflow.com/questions/395877/are-child-processes-created-with-fork-automatically-killed-when-the-parent-is –

0

Nada, a menos que uno pase a ser reemplazado por el hilo que ejecuta el nuevo proceso.

0

En POSIX cuando un proceso multiproceso se bifurca, el proceso secundario se ve exactamente como una copia del elemento primario, pero en el que todos los hilos se detenían y desaparecían.

Esto es muy malo si los hilos están sosteniendo bloqueos.

Por esta razón, hay un mecanismo tosco llamado pthread_atfork en el que puede registrar manejadores para esta situación.

Cualquier módulo de programa correctamente escrito (y especialmente el middleware reutilizable) que usa mutexes debe llamar al pthread_atfork para registrar algunos manejadores, para que no se comporte mal si el proceso llama al fork.

Además de los bloqueos mutex, los subprocesos podrían tener otros recursos, como datos específicos de subprocesos escondidos con pthread_setspecific, que solo son accesibles para el subproceso (y el subproceso es responsable de limpiarlo mediante un destructor).

En el proceso secundario, no se ejecuta dicho destructor. El espacio de direcciones se copia, pero el subproceso y su valor específico de subproceso no está allí, por lo que la memoria se filtra en el elemento secundario. Esto puede y debe ser manejado con controladores pthread_atfork también.

3

Por lo general, es muy malo bifurcar un hilo. Se supone que el proceso bifurcado es una copia completa del elemento primario, excepto que con los hilos no lo es. Hay una función pthread_atfork() que a veces ayuda. Si debe bifurcar un hilo, lo mejor es llamar al exec() inmediatamente después del fork().

le sugiero que lea las advertencias de los desarrolladores POSIX en la documentación de fork() y pthread_atfork() (Ver http://pubs.opengroup.org/onlinepubs/007904975/functions/fork.html y http://pubs.opengroup.org/onlinepubs/007904975/functions/pthread_atfork.html).

Desde el fork() documentación:

La función fork() De este modo se utiliza únicamente para ejecutar nuevos programas, y los efectos de llamar a las funciones que requieren determinados recursos entre la llamada a fork() y la llamada a una función exec son indefinido

Cuestiones relacionadas