uso sistemas scratch que programacion operativos multihilos multihilo multihilamiento ejemplos definicion multithreading operating-system fork

sistemas - que es multithreading en programacion



horquilla en programa multihilo (2)

El problema con forking cuando tiene algunos subprocesos en ejecución es que la bifurcación solo copia el estado de la CPU del subproceso que lo llamó. Es como si todos los otros hilos simplemente murieran, instantáneamente, dondequiera que estén.

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

pthread ofrece una función pthread_atfork ; en teoría, podría bloquear todos los bloqueos del programa antes de abrirlos, luego liberarlos y tal vez salir con vida, pero es arriesgado, porque siempre podría perder uno. Y, por supuesto, las pilas de los otros hilos no serán liberadas.

He escuchado que mezclar forking y threading en un programa podría ser muy problemático, a menudo resultando en un comportamiento misterioso, especialmente cuando se trata de recursos compartidos, como bloqueos, tuberías, descriptores de archivos. Pero nunca entiendo completamente cuáles son exactamente los peligros y cuándo podrían ocurrir. Sería fantástico si alguien con experiencia en esta área pudiera explicar un poco más detalladamente cuáles son las trampas y qué se debe tener cuidado al programar en un entorno de este tipo.

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

Por favor, no reduzca su respuesta simplemente "respondiendo" a mi escenario de ejemplo. ¡Cualquier sugerencia, soluciones alternativas o experiencias que no estén relacionadas con el ejemplo pero que sean útiles para proporcionar un diseño limpio serían excelentes! ¡Gracias!


Es realmente bastante simple. Los problemas con múltiples procesos y subprocesos siempre surgen de datos compartidos. Si no hay datos compartidos, no pueden surgir problemas posibles.

En su ejemplo, los datos compartidos son la cola que pertenece al subproceso principal: aquí surgirán cualquier posible conflicto o condiciones de carrera. Los métodos típicos para "resolver" estos problemas implican esquemas de bloqueo: un subproceso de trabajo bloqueará la cola antes de insertar cualquier información, y el subproceso principal bloqueará la cola antes de eliminarla.