[Cascavel-pm] NFS x flock
Gabriel Vieira
gabriel.vieira em gmail.com
Quinta Fevereiro 9 15:33:30 PST 2006
Existe alguma melhora utilizando o código:
open(LOCK, '>', $lockfile) if ! -e $lockfile;
???
Bom... há possibilidade de um programa servidor?
Onde recebe a requisição dos clientes e ele (somente ele) cria a lista de
espera?
Ex.:
O servidor roda "24hr" aguardando instrucoes dos clientes e imprimindo as
requisições em print SELECT.
Em seguida efetuaria as requisições.
recebe,Lê,cria lista,executa lista
?
* a tesourinha eh show em, paguei pau hehe
----- Original Message -----
From: "Breno G. de Oliveira" <breno em clavis.com.br>
To: "Cascavel Perl Mongers" <cascavel-pm em pm.org>
Sent: Thursday, February 09, 2006 9:46 PM
Subject: Re: [Cascavel-pm] NFS x flock
Rod Za wrote:
>
> O que fiz foi simplesmente criar um arquivo com terminação .lock e
> verificar se este arquivo
> existe. Existindo significa que outro processo já está rodando, não
> existindo é então criado
> este arquivo (para que outro processo não rode).
>
> Coisa simples e que substitui o que vc precisa. Lógicamente irá
> substituir se vc depender
> somente de seu código! :)
>
O único problema com arquivos de locking é a questão da concorrência
entre processos. Imaginem o seguinte programa:
------------------8<------------------
if(! -e $lockfile)
{
open(LOCK, '>', $lockfile) or die $!;
close(LOCK);
# (...) Regiao Critica do meu programa
}
unlink($lockfile)
------------------8<------------------
O programa aparentemente é seguro para essa RC, mas imaginem o seguinte
cenário hipotético:
Duas instâncias desse programa, A e B, estão sendo executadas ao mesmo
tempo em um sistema multiprogramado (ou seja, com escalonamento de
processos).
O processo A executa o trecho "if(! -e $lockfile)" e, como não existe o
arquivo, ele entra no laço. Só que antes de executar a instrução
seguinte, ele é escalonado e dá lugar para o outro processo, o B.
Esse, por sua vez, executa o trecho "if(! -e $lockfile)" e, como AINDA
não existe o arquivo, ele *também* entra no laço. Ele então cria o
arquivo e continua seu processamento até também ser escalonado, dando
lugar de volta para o processo A.
Como o processo A já executou o "if", ele simplesmente continua dali e
abre o arquivo de lock como se nada tivesse acontecido (dessa vez
simplesmente sobrescrevendo-o, e não criando).
Como é apenas uma linha de diferença (embora em termos de ciclos de
máquina seja bem mais) é difícil esperar que uma situação dessas
aconteça com frequência, mas se esquecermos dela alguns problemas
inesperados podem acontecer quando o caso hipotético acontecer e não
saberemos pq.
Enfim, sem polêmicas ;) É apenas um preço que pagamos pela
portabilidade, ninguém perde (muito) o sono por causa disso)
[]s,
breno
_______________________________________________
Cascavel-pm mailing list
Cascavel-pm em pm.org
http://mail.pm.org/mailman/listinfo/cascavel-pm
Mais detalhes sobre a lista de discussão Cascavel-pm