• Publicidad

Duda sobre funcion wait() en Perl

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Duda sobre funcion wait() en Perl

Notapor fgalves » 2007-11-17 21:57 @956

Hola a todos,

El caso es que tengo un problema que me está volviendo loco...

Tengo un proceso padre que espera en un bucle por la finalización de los procesos hijos. Algo así como:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
# We wait until all the children have finished
        while($nbProc > 0) {                   
            &waitEndOfChild(\$nbProc);        
        }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


donde $nbProc es un contador con el número de procesos hijos todavía ejecutándose.

Y he aquí el código de la función waitEndOfChild, ejecutada por el proceso padre, donde se pone en un bucle a la espera de que sus hijos vayan terminando su ejecución, mediante la función wait():

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
# wait until a child dies and add its subResults into the main one
sub waitEndOfChild {
    my $nbProc = $_[0];
       
    my $childPid = wait();     
    $$nbProc--;
    # When a child has finished we add the results generated
    # in a temporary dump file into the main hash results.
    &FqStatsCore::addSubProcessesResultsToMain($childPid);
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Mi duda es la siguiente: ¿que pasaría en el supuesto caso en que dos o más procesos hijos terminen exactamente - o casi - al mismo tiempo? ¿Intentará el proceso padre acceder en paralelo a la función addSubProcessesResultsToMain o bien, la secuencialidad de ejecución de dicha función está garantizada, hijo por hijo según el orden en que finalizan?
Dicha función addSubProcessesResultsToMain es encargada de incrementar un contador que es gestionado por el padre, y tengo la sospecha de que diversos hijos, al terminar casi al mismo tiempo, hacen que el padre intente actualizar dicha variable muchas veces al mismo tiempo, dando como resultado valores erróneos para dicho contador (un problema análogo al de los mutex o semáforos, pero en este caso, con un solo proceso). Pero como ya he dicho, no son más que suposiciones y todo depende de si la secuencialidad está o no garantizada, cosa que desconozco...

¿Alguien me podría quitar la duda y afirmar/rechazar mis sospechas?

¡¡Muchas gracias por adelantado!!
Un cordial saludo,
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Publicidad

Notapor explorer » 2007-11-18 06:33 @314

El proceso padre es solo un hilo, por lo que no accederá en paralelo a esa función.

El padre solo se enterará de la terminación de sus hijos a través del wait, no por otro camino, por lo que debería ejecutar la función de uno en uno.

Eso es lo que dice la definición de wait(). Otra cosa es que no funcione bien. Depende del sistema operativo que wait() regrese en la terminación de CADA hijo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados