Чтобы быть ясным, гарантировать, что файл будет создан только в том случае, если он не существует, это не то же самое, что атомарность. Операция является атомной тогда и только тогда, когда два или несколько отдельных потоков пытаются сделать одно и то же в одно и то же время, точно один будет успешным, а все остальные потерпят неудачу.
Лучший способ, которым я знаю создайте файл атомарно в сценарии оболочки, следуя этому шаблону (и это не идеально):
В частности, touch
не является атомарным, так как он создаст файл, если его там нет, или просто обновить метку времени. Возможно, вы сможете играть в игры с разными отметками времени, но чтение и синтаксический анализ временной метки, чтобы увидеть, выиграл ли вы гонку, сложнее, чем указано выше. mkdir
может быть атомарным, но вам нужно будет проверить код возврата, потому что в противном случае вы можете только сказать, что «да, каталог был создан, но я не знаю, какой поток выиграл». Если вы находитесь в файловой системе, которая не поддерживает жесткие ссылки, вам, возможно, придется согласиться на менее идеальное решение.