Старый вопрос, но если я мог бы добавить к @ ответ Mehdrad, от несколько иной точки зрения ...
В Windows, удаление файла часто даже не полностью синхронны, и это даже не одиночный работа. В этом смысле он определенно не является атомарным.
Если вы посмотрите на инструменты вроде process monitor или посмотрите документацию MSFT для написания драйвера файловой системы, вы заметите, что удаление файла в Windows - это многоэтапный процесс. Сначала вам нужен дескриптор файла. Затем вы устанавливаете его расположение на «deleted». Это помещает файл в состояние, в котором у него есть «ожидающий удаления». Файл даже не будет удален из представления, пока последний дескриптор к нему не будет закрыт. Когда файл находится в этом состоянии, новые попытки открыть файл не сработают с STATUS_DELETE_PENDING
. Этот статус больше связан с временем выполнения - если вы вытащили вилку или перезагрузили файлы, они не останутся в этом состоянии.
Таким образом, это может быть или не быть релевантным тому, как вы используете удаление, но важно помнить, что в Windows удаление не обязательно вступит в силу сразу же и при одновременном доступе может блокировать дальнейшие запросы из доступа к файлу.
Чтобы уточнить: Как объяснено, процесс выполнения для удаления файла не является атомарным, поскольку он состоит из нескольких шагов. Тем не менее, фактическое действие в файловой системе (NTFS) _is_ атомарно, поэтому удаление физически выполняется в целом или вообще отсутствует. – mafu
@mafutrct - Я не согласен с вашей оценкой. Как я упоминал, удаление файла в NT - это многоступенчатый процесс, и, как можно заметить, он не завершился до тех пор, пока последний дескриптор файла не будет удален. – asveikau
Да, но физические изменения в файловой системе (в отличие от действий виртуального изменения в ОЗУ, которые вы объяснили) действуют атомарно, если я это правильно понимаю. То есть независимо от того, когда в процессе удаления в NTFS вы прерываете систему, состояние будет согласованным - файл будет либо полностью удален, либо вообще не будет удален. Я считаю, что это важно, поскольку, если бы это было не так, процесс удаления файла должен был бы обрабатываться по-разному в коде пользователя. «Atomic», возможно, несколько вводит в заблуждение термин для всей этой идеи. – mafu