Historia del tema
Los hilos (threads) aparecieron en Perl como respuesta a la necesidad de organizar cálculos concurrentes y trabajar paralelamente con recursos en programas multitarea. El módulo estandarizado threads ha estado disponible en Perl desde la versión 5.8, pasando gradualmente de experimentos con ithreads a threads::shared universal.
Problema
La primera dificultad es que Perl no soporta hilos de manera nativa, como se implementa en lenguajes como Java. Los hilos en Perl funcionan mediante la copia de la pila y los datos de cada hilo, lo que genera sobrecostos y hace imposible el trabajo directo con variables globales (excepto las variables con enlace especial a través de threads::shared). Además, Perl no garantiza la operación independiente de los hilos al escribir datos simultáneamente sin sincronización explícita.
Solución
Se utiliza el módulo threads para organizar hilos y un módulo adicional, threads::shared, para intercambiar datos entre hilos. Asegurar la sincronización y la integridad de los datos recae en el desarrollador, a menudo a través del uso de locks.
Ejemplo de código:
use threads; use threads::shared; my $counter :shared = 0; sub increment { lock($counter); $counter++; } my @threads; for (1..10) { push @threads, threads->create(\&increment); } $_->join for @threads; print "Counter: $counter ";
Características clave:
¿Es posible usar cualquier variable global sin threads::shared y esperar que los hilos vean los cambios entre ellos?
No. Las variables globales se copian individualmente en cada hilo. El intercambio debe realizarse solo a través de threads::shared o mediante otros IPC (a través de procesos).
¿Está permitido ejecutar fork y threads en un mismo script de Perl?
No se recomienda mezclar fork y threads, ya que esto puede llevar a errores impredecibles y comportamientos inestables. Perl advierte oficialmente sobre el uso simultáneo de estas técnicas.
¿Se pueden transmitir estructuras de datos complejas entre hilos a través de referencias estándar?
No. Perl no copia automáticamente estructuras anidadas recursivamente, y tales intentos conducen a errores o resultados no intuitivos. Para ello, se requiere copias profundas y el uso de recursos compartidos.
Un desarrollador creó una simple cola mediante un arreglo, actualizado simultáneamente desde varios hilos sin threads::shared. A menudo se corrompían los datos, surgiendo resultados incorrectos del trabajo del programa.
Ventajas:
Desventajas:
Uso de threads::shared con locks, toda la cola se declaró como compartida, la sincronización se realizó a través de locks. El programa funcionó de manera estable, incluso bajo carga intensa.
Ventajas:
Desventajas: