[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