En aquest mòdul, explorarem la programació multifil en Perl. La programació multifil permet executar múltiples fils d'execució dins d'un mateix procés, aprofitant millor els recursos del sistema i millorant el rendiment de les aplicacions. Aprendrem com crear, gestionar i sincronitzar fils en Perl.

Continguts

  1. Introducció a la Programació Multifil
  2. Creació de Fils
  3. Comunicació entre Fils
  4. Sincronització de Fils
  5. Exercicis Pràctics

  1. Introducció a la Programació Multifil

La programació multifil permet que un programa executi múltiples tasques simultàniament. Això és especialment útil en aplicacions que requereixen molta E/S o que poden dividir-se en tasques independents.

Avantatges de la Programació Multifil

  • Millor Rendiment: Permet aprofitar millor els recursos del sistema.
  • Responsivitat: Millora la resposta de les aplicacions interactives.
  • Eficàcia: Permet realitzar múltiples tasques alhora.

Desavantatges de la Programació Multifil

  • Complexitat: La gestió de fils pot ser complexa.
  • Condicions de Carrera: Problemes de sincronització poden causar errors difícils de detectar.
  • Bloquejos: Els fils poden bloquejar-se mútuament si no es gestionen correctament.

  1. Creació de Fils

Per crear fils en Perl, utilitzarem el mòdul threads. Aquest mòdul proporciona una interfície per crear i gestionar fils.

Exemple Bàsic de Creació de Fils

use strict;
use warnings;
use threads;

# Subrutina que serà executada en un fil
sub treball {
    my $id = shift;
    print "Fil $id en execució\n";
    sleep(2);
    print "Fil $id finalitzat\n";
}

# Crear fils
my $fil1 = threads->create(\&treball, 1);
my $fil2 = threads->create(\&treball, 2);

# Esperar que els fils acabin
$fil1->join();
$fil2->join();

print "Tots els fils han finalitzat\n";

Explicació del Codi

  • use threads;: Carrega el mòdul threads.
  • threads->create(\&treball, 1);: Crea un nou fil que executa la subrutina treball amb l'argument 1.
  • $fil1->join();: Espera que el fil $fil1 acabi.

  1. Comunicació entre Fils

Els fils poden comunicar-se entre ells utilitzant variables compartides. El mòdul threads::shared permet compartir variables entre fils.

Exemple de Comunicació entre Fils

use strict;
use warnings;
use threads;
use threads::shared;

my $compte :shared = 0;

sub incrementar {
    for (1..1000) {
        $compte++;
    }
}

# Crear fils
my @fils;
for (1..10) {
    push @fils, threads->create(\&incrementar);
}

# Esperar que els fils acabin
$_->join() for @fils;

print "Valor final del compte: $compte\n";

Explicació del Codi

  • use threads::shared;: Carrega el mòdul threads::shared.
  • my $compte :shared = 0;: Declara una variable compartida.
  • $compte++;: Incrementa la variable compartida.

  1. Sincronització de Fils

La sincronització és crucial per evitar condicions de carrera. El mòdul Thread::Semaphore proporciona semàfors per gestionar l'accés a recursos compartits.

Exemple de Sincronització amb Semàfors

use strict;
use warnings;
use threads;
use Thread::Semaphore;

my $semafor = Thread::Semaphore->new();

sub treball {
    $semafor->down(); # Bloqueja el semàfor
    print "Fil en execució\n";
    sleep(2);
    print "Fil finalitzat\n";
    $semafor->up(); # Allibera el semàfor
}

# Crear fils
my @fils;
for (1..5) {
    push @fils, threads->create(\&treball);
}

# Esperar que els fils acabin
$_->join() for @fils;

print "Tots els fils han finalitzat\n";

Explicació del Codi

  • use Thread::Semaphore;: Carrega el mòdul Thread::Semaphore.
  • $semafor->down();: Bloqueja el semàfor.
  • $semafor->up();: Allibera el semàfor.

  1. Exercicis Pràctics

Exercici 1: Creació de Fils

Crea un programa que creï 5 fils, cadascun dels quals imprimeixi el seu identificador i dormi durant 1 segon.

Solució

use strict;
use warnings;
use threads;

sub treball {
    my $id = shift;
    print "Fil $id en execució\n";
    sleep(1);
    print "Fil $id finalitzat\n";
}

my @fils;
for my $i (1..5) {
    push @fils, threads->create(\&treball, $i);
}

$_->join() for @fils;

print "Tots els fils han finalitzat\n";

Exercici 2: Comunicació entre Fils

Modifica l'exemple de comunicació entre fils per utilitzar 20 fils que incrementin una variable compartida 500 vegades cadascun.

Solució

use strict;
use warnings;
use threads;
use threads::shared;

my $compte :shared = 0;

sub incrementar {
    for (1..500) {
        $compte++;
    }
}

my @fils;
for (1..20) {
    push @fils, threads->create(\&incrementar);
}

$_->join() for @fils;

print "Valor final del compte: $compte\n";

Conclusió

En aquest mòdul, hem après els conceptes bàsics de la programació multifil en Perl, incloent la creació de fils, la comunicació entre fils i la sincronització de fils. La programació multifil pot millorar significativament el rendiment de les aplicacions, però també introdueix complexitat addicional. Amb pràctica i una comprensió sòlida dels conceptes, podràs aprofitar els avantatges de la programació multifil en els teus projectes Perl.

© Copyright 2024. Tots els drets reservats