[Cascavel-pm] NFS x flock

Breno G. de Oliveira breno em clavis.com.br
Quinta Fevereiro 9 15:46:58 PST 2006


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






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