tenedor en progtwig de subprocesos múltiples

He oído que mezclar bifurcación y subprocesamiento en un progtwig podría ser muy problemático, a menudo como resultado de un comportamiento misterioso, especialmente cuando se trata de recursos compartidos, como lockings, derivaciones, descriptores de archivos. Pero nunca entiendo completamente cuáles son exactamente los peligros y cuándo pueden suceder. Sería genial si alguien con experiencia en esta área pudiera explicar un poco más en detalle cuáles son las dificultades y qué debe ser cuidado al progtwigr en un entorno de este tipo.

Por ejemplo, si quiero escribir un servidor que recolecta datos de varios recursos diferentes, una solución que he pensado es hacer que el servidor engendre un conjunto de hilos, cada uno para llamar a otro progtwig para hacer el trabajo real, abrir tuberías para recuperar los datos del niño. Cada uno de estos subprocesos responde por su propio trabajo, sin intercambio de datos en b / w, y cuando se recostackn los datos, el hilo principal tiene una cola y estos subprocesos de trabajo simplemente pondrán el resultado en la cola. ¿Qué podría salir mal con esta solución?

No limite su respuesta simplemente “respondiendo” mi escenario de ejemplo. Cualquier sugerencia, solución alternativa o experiencia que no esté relacionada con el ejemplo pero que sea útil para proporcionar un diseño limpio sería genial. ¡Gracias!

El problema con el bifurcación cuando tiene algunos subprocesos en ejecución es que el tenedor solo copia el estado de la CPU del único subproceso que lo llamó. Es como si todos los otros hilos acabaran de morir, instantáneamente, donde sea que estén.

El resultado de esto es que los lockings no se liberan, y los datos compartidos (como el montón malloc) pueden estar dañados.

pthread sí ofrece una función pthread_atfork ; en teoría, podría tomar cada locking en el progtwig antes de bifurcarlo, soltarlo después, y tal vez hacerlo salir vivo, pero es arriesgado, porque siempre se puede perder uno. Y, por supuesto, las stacks de los otros hilos no serán liberadas.

Es realmente bastante simple. Los problemas con múltiples hilos y procesos siempre surgen de los datos compartidos. Si no hay datos compartidos, entonces no puede haber problemas posibles.

En su ejemplo, los datos compartidos son la cola propiedad del hilo principal; aquí se presentarán posibles conflictos o condiciones de carrera. Los métodos típicos para “resolver” estos problemas implican esquemas de locking: un hilo de trabajo bloqueará la cola antes de insertar cualquier dato, y el hilo principal bloqueará la cola antes de eliminarla.