Edit: Diperbarui Agustus 2017 dengan hasil Windows terbaru.
Saya akan memberi Anda jawaban dengan tautan untuk menguji kode dan hasil sebagai penulis Boost.AFIO yang diusulkan yang mengimplementasikan sistem file asinkron dan pustaka file i / o C ++.
Pertama, O_APPEND atau FILE_APPEND_DATA yang setara di Windows berarti bahwa kenaikan tingkat file maksimum ("panjang" file) bersifat atomic di bawah penulis bersamaan. Ini dijamin oleh POSIX, dan Linux, FreeBSD, OS X dan Windows semuanya menerapkannya dengan benar. Samba juga mengimplementasikannya dengan benar, NFS sebelum v5 tidak karena tidak memiliki kemampuan format kabel untuk ditambahkan secara atomik. Jadi jika Anda membuka file dengan append-only, penulisan bersamaan tidak akan robek satu sama lain di OS utama mana pun kecuali NFS terlibat.
Namun, pembacaan bersamaan ke atomic appends dapat melihat penulisan yang robek tergantung pada OS, sistem pengarsipan, dan flag apa yang Anda gunakan untuk membuka file - penambahan luas file maksimum bersifat atomic, tetapi visibilitas penulisan sehubungan dengan pembacaan mungkin atau mungkin tidak menjadi atom. Berikut ringkasan singkat berdasarkan bendera, OS, dan sistem pengarsipan:
Tidak ada O_DIRECT / FILE_FLAG_NO_BUFFERING:
Microsoft Windows 10 dengan NTFS: perbarui atomicity = 1 byte hingga dan termasuk 10.0.10240, dari 10.0.14393 setidaknya 1Mb, mungkin tak terbatas (*).
Linux 4.2.6 dengan ext4: memperbarui atomicity = 1 byte
FreeBSD 10.2 dengan ZFS: perbarui atomicity = setidaknya 1Mb, mungkin tak terbatas (*)
O_DIRECT / FILE_FLAG_NO_BUFFERING:
Microsoft Windows 10 dengan NTFS: perbarui atomicity = hingga dan termasuk 10.0.10240 hingga 4096 byte hanya jika halaman sejajar, sebaliknya 512 byte jika FILE_FLAG_WRITE_THROUGH nonaktif, 64 byte lainnya. Perhatikan bahwa atomicity ini mungkin merupakan fitur PCIe DMA daripada yang dirancang. Sejak 10.0.14393, setidaknya 1Mb, mungkin tak terbatas (*).
Linux 4.2.6 dengan ext4: memperbarui atomicity = setidaknya 1Mb, mungkin tak terbatas (*). Perhatikan bahwa Linux sebelumnya dengan ext4 pasti tidak melebihi 4096 byte, XFS tentu saja memiliki penguncian khusus tetapi sepertinya Linux baru-baru ini akhirnya memperbaikinya.
FreeBSD 10.2 dengan ZFS: perbarui atomicity = setidaknya 1Mb, mungkin tak terbatas (*)
Anda dapat melihat hasil uji empiris mentah di https://github.com/ned14/afio/tree/master/programs/fs-probe . Perhatikan bahwa kami menguji robekan offset hanya pada kelipatan 512 byte, jadi saya tidak dapat mengatakan jika pembaruan sebagian dari sektor 512 byte akan robek selama siklus baca-ubah-tulis.
Jadi, untuk menjawab pertanyaan OP, penulisan O_APPEND tidak akan mengganggu satu sama lain, tetapi penulisan O_APPEND yang bersamaan dengan O_APPEND mungkin akan melihat penulisan yang robek di Linux dengan ext4 kecuali O_DIRECT aktif, di mana penulisan O_APPEND Anda harus berupa beberapa sektor berukuran sektor.
(*) "Probably infinite" berasal dari klausa berikut di spek POSIX:
Semua fungsi berikut harus bersifat atomik satu sama lain dalam efek yang ditentukan dalam POSIX.1-2008 ketika mereka beroperasi pada file biasa atau tautan simbolik ... [banyak fungsi] ... read () ... write ( ) ... Jika dua utas masing-masing memanggil salah satu fungsi ini, setiap panggilan akan melihat semua efek yang ditentukan dari panggilan lainnya, atau tidak satupun dari mereka. [Sumber]
dan
Penulisan dapat dibuat bersambung sehubungan dengan membaca dan menulis lainnya. Jika read () data file dapat dibuktikan (dengan cara apa pun) terjadi setelah write () data, itu harus mencerminkan write () itu, bahkan jika panggilan dibuat oleh proses yang berbeda. [Sumber]
tapi sebaliknya:
Volume POSIX.1-2008 ini tidak menentukan perilaku penulisan bersamaan ke file dari beberapa proses. Aplikasi harus menggunakan beberapa bentuk kontrol konkurensi. [Sumber]
Anda dapat membaca lebih lanjut tentang artinya di jawaban ini
fsync(2)
memberikan jaminan sebanyak yang diberikansync(2)
, dan tidak memiliki banyak pengaruh besar pada kinerja.