[Cascavel-pm] Duvida modelagem

Donato Azevedo donatoaz em gmail.com
Quinta Junho 14 15:13:53 PDT 2007


On 6/7/07, Luis Motta Campos <luismottacampos em yahoo.co.uk> wrote:
> On Jun 7, 2007, at 2:30 AM, Donato Azevedo wrote:
> > On 6/5/07, Luis Motta Campos <luismottacampos em yahoo.co.uk> wrote:
> [snip]
> >>    Vamos ver: você tem um problema, tem uma restrição de modelagem
> >> sobre uma interface muito ruim. Fica esperto com race-conditions,
> >> elas vão aparecer conforme o volume de operações cresça o bastante.
> >
> > A principio nao pensei em ser thread safe, mas vou dar uma olhada
> > pra melhorar,
> > conheço um pouco sobre locking em perl, mas nada muito evoluido (uso o
> > flock com handles para arquivo para criar exclusão mútua.. fiz isso
> > num aplicativo e funfou beleza..)
>
>    Se você tem um problema do tipo Produtor-Consumidor onde múltiplos
> agentes trabalham ao mesmo tempo para obter qualquer objetivo que
> seja, PRECISA ser THREAD SAFE.

Se alguem ainda se importa, eis como corrigi (ou penso ter corrigido o problema)

<code>
sub send {
    my $self = shift;

    # data atual no formato YYYYMMDD
    my $currDate = date();
    # Verifica atributo
    unless ( $self->client_name ) { croak "Nome de cliente incorreto:
verifique o atributo client_name\n"; }

    open S, "> SEMAPHORE.sem" or croak "erro ao criar semaforo SiTef:$!";
    flock S, LOCK_EX or croak "erro ao lockar arquivo semaforo SiTef:$!";
    # Regiao com exclusão mútua
        # obtem o indice do arquivo a ser escrito
        my $fileIndex = $self->countFiles() + 1;
        # Imprime no arquivo de saida
        open ( OUTFILE,
">$self->{send_dir}/$self->{client_name}\_$currDate$fileIndex.txt" )
|| croak "unable to open file : $!";
        eval { print OUTFILE $self };
        if ($@)
        {
            # falta excluir o arquivo aberto e liberar o semaphore
            croak $@;
        }
        close OUTFILE;
    close S;
}
</code>

--
Donato Azevedo


Mais detalhes sobre a lista de discussão Cascavel-pm