O mkdir -p é seguro para paralelizar?

O mkdir -p é seguro para paralelizar?

Estou escrevendo regras do Makefile assim:

out/%.x: ...
    mkdir -p $(@D)/
    ...

Pretendo paralelizar esse Makefile( -j), que irá acionar vários mkdir -p's simultaneamente.

Isso é seguro? Ou preciso me proteger contra problemas garantindo que mkdir -pisso aconteça apenas uma vez?

(Observaçãoisso mkdir -pnão é necessariamente uma única operação no nível do sistema de arquivos, ao contrário de mkdir.)

Responder1

A justificativa paraPOSIXmkdirdiz

Como nenhum erro será produzido se algum componente do caminho já existir, o-pA opção também é útil para garantir a existência de um diretório específico.

Isto sugere que o uso paralelo deve ser seguro. Entendo suas dúvidas, dado o potencial de corridas, então vamos ver uma implementação...

No GNU coreutils, a -popção acaba sendo tratada pormkancesdirs, que contém uma descrição útil que deve acalmar seus medos:

Certifique-se de que os diretórios ancestrais de FILE existam, usando um algoritmo que deve funcionar mesmo que dois processos executem esta função em paralelo.

(Em vez de agir imediatamente em caso de erros mkdir, ele tenta chdirentrar em cada diretório de componente e só falha se falhar.)

Se você estiver usando o GNU Make, você pode usar seuexpansão secundáriapara lidar com diretórios da mesma forma que outros pré-requisitos:

.SECONDEXPANSION:

%/:
        mkdir -p $@

out/%.x: $$(@D)/ ...
        ...

informação relacionada