これは非常に遅い答えですが... はい rename()
アトミックですが、質問の意味ではありません。 Linux では rename(2)
言います:
ただし、上書きすると、古いパスと新しいパスの両方が名前変更中のファイルを参照するウィンドウが表示される可能性があります。
しかし rename()
非常に重要な意味でアトミックであることには変わりありません。ファイルを上書きするために使用すると、古いバージョンか新しいバージョンのいずれかだけになるだけです。
[アップデート: ただし、@ jonas-wielicki がコメントで指摘しているように、名前を変更するファイルが実際に最新の内容であることを fsync()
を使用して確認する必要があります。 と友達。]
newpath が既に存在する場合、それは自動的に置き換えられます (いくつかの条件に従います。以下のエラーを参照してください)。そのため、newpath にアクセスしようとする別のプロセスがそれを見つけられない点はありません。
ERRORS が表示された場合、名前の変更が失敗する可能性があることがわかりますが、原子性が損なわれることはありません。
これはすべて Linux の man ページからのものです。私が知らないのは、あなたが rename()
を実行したかどうかです サーバーが異なるOSを実行するネットワークファイルシステム上。その場合、クライアントはアトミック性を保証する地獄に希望を持っていますか?私はそれを疑います.
はい、いいえ。
rename() は、OS がクラッシュしないことを前提としてアトミックです。他のファイルシステム op で分割することはできません。
システムがクラッシュした場合、代わりに ln() 操作が表示される場合があります。
また、ネットワーク ファイルシステムで操作している場合、操作が成功すると ENOENT が返される可能性があることに注意してください。ローカル ファイル システムではそれができません。
あなたの質問の「基本的に」の部分が有効かどうかはわかりません。この 2 つの間になんらかの同期がない限り、アトミックな名前変更がどの程度のものであるかは問題ではありません。名前を変更する前にディレクトリのコピーがそこにある場合、両方の場所に file1 があります。
スレッドまたはプロセスのどちらを意味しているかはわかりませんが、両方にロック メカニズムがある場合、スレッド ロックはプロセスの境界を越える必要がないため、はるかに単純です。