Bearbeiten: Aktualisiert im August 2017 mit den neuesten Windows-Ergebnissen.
Ich werde Ihnen eine Antwort mit Links zu Testcode und Ergebnissen als Autor des Vorschlags geben Testcode Boost.AFIO geben, das ein asynchrones Dateisystem und eine Datei-I / O-C ++ - Bibliothek implementiert.
Erstens bedeutet O_APPEND oder das entsprechende FILE_APPEND_DATA unter Windows, dass Inkremente des maximalen Dateibereichs (Dateilänge) bei gleichzeitigen Writern atomar sind . Dies wird von POSIX garantiert und von Linux, FreeBSD, OS X und Windows korrekt implementiert. Samba implementiert es auch korrekt, NFS vor v5 nicht, da es nicht in der Lage ist, das Drahtformat atomar anzuhängen. Wenn Sie Ihre Datei also nur mit Anhängen öffnen, werden gleichzeitige Schreibvorgänge auf keinem größeren Betriebssystem in Bezug aufeinander gerissen, es sei denn, NFS ist beteiligt.
Gleichzeitige Lesevorgänge an atomaren Anhängen können jedoch möglich sein je nach Betriebssystem, Dateisystem und den Flags, mit denen Sie die Datei geöffnet haben, zerrissene Schreibvorgänge auftreten. Das Inkrement des maximalen Dateibereichs ist atomar, aber die Sichtbarkeit der Schreibvorgänge in Bezug auf Lesevorgänge kann oder kann nicht atomar sein. Hier ist eine kurze Zusammenfassung nach Flags, Betriebssystem und Dateisystem:
Nein O_DIRECT / FILE_FLAG_NO_BUFFERING:
Microsoft Windows 10 mit NTFS: Update Atomicity = 1 Byte bis einschließlich 10.0.10240, von 10.0.14393 mindestens 1 MB, wahrscheinlich unendlich (*).
Linux 4.2.6 mit ext4: Atomizität aktualisieren = 1 Byte
FreeBSD 10.2 mit ZFS: Atomizität aktualisieren = mindestens 1 MB, wahrscheinlich unendlich (*)
O_DIRECT / FILE_FLAG_NO_BUFFERING:
Microsoft Windows 10 mit NTFS: Aktualisieren Sie Atomicity = bis einschließlich 10.0.10240 bis zu 4096 Byte nur, wenn die Seite ausgerichtet ist, andernfalls 512 Byte, wenn FILE_FLAG_WRITE_THROUGH deaktiviert ist, andernfalls 64 Byte. Beachten Sie, dass diese Atomizität wahrscheinlich eher ein Merkmal von PCIe DMA ist als in. Seit 10.0.14393, mindestens 1 MB, wahrscheinlich unendlich (*).
Linux 4.2.6 mit ext4: Atomizität aktualisieren = mindestens 1 MB, wahrscheinlich unendlich (*). Beachten Sie, dass frühere Linuxes mit ext4 definitiv 4096 Bytes nicht überschritten haben. XFS hatte sicherlich benutzerdefinierte Sperren, aber es sieht so aus, als ob das aktuelle Linux dies endlich behoben hat.
FreeBSD 10.2 mit ZFS: Atomizität aktualisieren = mindestens 1 MB, wahrscheinlich unendlich (*)
Die rohen empirischen Testergebnisse finden Sie unter https://github.com/ned14/afio/tree/master/programs/fs-probe . Beachten Sie, dass wir nur bei 512-Byte-Vielfachen auf zerrissene Offsets testen. Daher kann ich nicht sagen, ob eine teilweise Aktualisierung eines 512-Byte-Sektors während des Lese-, Änderungs- und Schreibzyklus reißen würde.
Um die Frage des OP zu beantworten, stören sich O_APPEND-Schreibvorgänge nicht gegenseitig. Bei Lesevorgängen, die gleichzeitig mit O_APPEND-Schreibvorgängen ausgeführt werden, werden unter Linux mit ext4 wahrscheinlich zerrissene Schreibvorgänge angezeigt, es sei denn, O_DIRECT ist aktiviert, woraufhin Ihre O_APPEND-Schreibvorgänge ein Sektorgrößenmultiplikator sein müssten.
(*) "Wahrscheinlich unendlich" ergibt sich aus diesen Klauseln in der POSIX-Spezifikation:
Alle folgenden Funktionen müssen in den in POSIX.1-2008 angegebenen Effekten zueinander atomar sein, wenn sie mit regulären Dateien oder symbolischen Links arbeiten ... [viele Funktionen] ... read () ... write ( ) ... Wenn zwei Threads jeweils eine dieser Funktionen aufrufen, werden bei jedem Aufruf entweder alle angegebenen Effekte des anderen Aufrufs oder keine davon angezeigt. [Quelle]
und
Schreibvorgänge können in Bezug auf andere Lese- und Schreibvorgänge serialisiert werden. Wenn nachgewiesen werden kann, dass ein Lesen () von Dateidaten (auf irgendeine Weise) nach einem Schreiben () der Daten erfolgt, muss es dieses Schreiben () widerspiegeln, selbst wenn die Aufrufe von verschiedenen Prozessen ausgeführt werden. [Quelle]
aber umgekehrt:
Dieses Volume von POSIX.1-2008 gibt nicht das Verhalten gleichzeitiger Schreibvorgänge in eine Datei aus mehreren Prozessen an. Anwendungen sollten eine Form der Parallelitätskontrolle verwenden. [Quelle]
Sie können mehr über die Bedeutung dieser in dieser Antwort lesen
fsync(2)
eine ebenso große Garantie wie dies dersync(2)
Fall ist und hat weniger Auswirkungen auf die Leistung.