[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