O Unix tem uma infinidade de sistemas de bloqueio. O que você encontrou é chamado de bloqueio de arquivo BSD, mas existem outros métodos de bloqueio de arquivos. Além disso, você também tem semáforos , mutexes e muito mais.
Quanto à sua pergunta direta, sim, é um jeito perfeito de ir. Não se preocupe com o tempo que leva. O bloqueio é uma atividade de alta sobrecarga, por sua própria natureza. É por isso que tanto esforço é dedicado à criação de mecanismos sem bloqueios .
A única coisa que me incomoda sobre o seu plano é o arquivo fictício que você tem que criar. Pode haver uma maneira mais simples de atingir seu objetivo desejado: mkdir(2)
. A chamada é atômica e você recebe um erro quando o diretório já existe. Por contraste, open(2)
é apenas atômico com O_EXCL
, que não está disponível em todos os lugares. Quando disponível, pode não funcionar como esperado, seja porque você está usando o NFSv2 ou porque você não ativou o Daemon de bloqueio de arquivos NFS .
Uma vez que a abordagem mkdir
é agradável, você pode fazer isso em scripts de shell, via mkdir(1)
. Vejo que você está usando o Perl, mas, nesse caso, é uma função incorporada, em vez de um módulo externo.
Outra coisa interessante é que ele funcionará no NFS sem nenhuma ajuda especial. Você não pode criar um diretório duas vezes.
O único problema com a abordagem mkdir()
é que não há como esperar que um diretório existente desapareça. Ou seja, não é uma operação de bloqueio de bloqueio. Sugiro que você o envolva com um temporizador, para que os processos que competem pelo bloqueio passem a maior parte do tempo dormindo. Sugiro que você faça com que cada processo espere um período aleatório de janela. Por exemplo, entre 100 e 200 ms, via usleep(3)
. Isso criaria uma forma de spinlock .