Ini jawaban yang sangat terlambat, tapi... ya rename()
adalah atom tetapi tidak dalam arti pertanyaan Anda. Di Linux, rename(2)
mengatakan:
Namun, saat menimpa mungkin akan ada jendela di mana jalur lama dan jalur baru merujuk ke file yang sedang diganti namanya.
Tapi rename()
masih bersifat atomik dalam arti yang sangat penting:jika Anda menggunakannya untuk menimpa file, Anda akan mendapatkan versi lama atau baru dan tidak ada yang lain.
[perbarui: tetapi seperti yang ditunjukkan oleh @jonas-wielicki di komentar, Anda perlu memastikan file yang Anda ganti namanya benar-benar memiliki konten terbaru, menggunakan fsync()
dan teman-teman.]
Jika jalur baru sudah ada, jalur baru akan diganti secara atomik (tunduk pada beberapa ketentuan; lihat KESALAHAN di bawah), sehingga tidak ada titik di mana proses lain yang mencoba mengakses jalur baru akan menemukannya hilang.
Jika Anda melihat KESALAHAN, Anda akan menemukan bahwa penggantian nama mungkin gagal, tetapi tidak akan merusak atomisitas.
Ini semua dari halaman manual Linux. Yang tidak saya ketahui adalah jika Anda melakukan rename()
pada sistem file jaringan tempat server menjalankan OS yang berbeda. Apakah klien memiliki harapan untuk menjamin atomisitas? Saya meragukannya.
Ya dan tidak.
rename() adalah atom dengan asumsi OS tidak crash. Itu tidak dapat dipisahkan oleh operasi sistem file lainnya.
Jika sistem mogok, Anda mungkin akan melihat operasi ln() sebagai gantinya.
Perhatikan juga, saat mengoperasikan sistem file jaringan, Anda mungkin mendapatkan ENOENT saat operasi berhasil dengan sukses. Sistem file lokal tidak dapat melakukannya untuk Anda.
Saya tidak yakin bagian "pada dasarnya" dari pertanyaan Anda valid. Kecuali jika Anda memiliki semacam sinkronisasi antara keduanya, tidak masalah seberapa nama atomnya diganti. Jika salinan direktori sampai di sana sebelum penggantian nama, Anda akan memiliki file1 di kedua tempat.
Saya tidak yakin apakah yang Anda maksud adalah thread atau proses, tetapi jika ada mekanisme penguncian untuk keduanya, kunci threading sejauh ini adalah yang paling sederhana karena tidak harus melewati batas proses.