клавиатура не открывается при щелчке на панели действий в окне просмотра

Чтобы быть ясным, гарантировать, что файл будет создан только в том случае, если он не существует, это не то же самое, что атомарность. Операция является атомной тогда и только тогда, когда два или несколько отдельных потоков пытаются сделать одно и то же в одно и то же время, точно один будет успешным, а все остальные потерпят неудачу.

Лучший способ, которым я знаю создайте файл атомарно в сценарии оболочки, следуя этому шаблону (и это не идеально):

  1. создайте файл, который имеет чрезвычайно высокую вероятность отсутствия (используя приличный случайный выбор номера или что-то в имя файла) и поместить в него какой-то уникальный контент (что-то, что ни один другой поток не имел бы - снова, случайное число или что-то еще)
  2. убедитесь, что файл существует и содержит содержимое, которое вы ожидаете от него
  3. создать жесткую ссылку из этого файла в желаемый файл
  4. убедиться, что нужный файл содержит ожидаемое содержимое

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

0
задан Pravin Chavan 26 February 2019 в 06:17
поделиться