Edit: mis à jour en août 2017 avec les derniers résultats Windows.
Je vais vous donner une réponse avec des liens vers le code de test et les résultats en tant qu'auteur du projet Boost.AFIO qui implémente un système de fichiers asynchrone et une bibliothèque C ++ d' entrées / sorties de fichiers.
Premièrement, O_APPEND ou l'équivalent FILE_APPEND_DATA sous Windows signifie que les incréments de l'étendue maximale du fichier ("longueur" du fichier) sont atomiques sous les auteurs simultanés. Ceci est garanti par POSIX et Linux, FreeBSD, OS X et Windows l'implémentent tous correctement. Samba l'implémente également correctement, NFS avant la v5 ne le faisant pas car il ne dispose pas de la capacité de formatage filaire pour l'ajout atomique. Ainsi, si vous ouvrez votre fichier avec un ajout uniquement, les écritures simultanées ne se déchireront pas les unes par rapport aux autres sur un système d'exploitation majeur, sauf si NFS est impliqué.
Cependant, les lectures simultanées aux appendices atomiques peuvent voir des écritures déchirées en fonction du système d'exploitation, du système de fichiers et des indicateurs avec lesquels vous avez ouvert le fichier - l'incrément de l'étendue maximale du fichier est atomique, mais la visibilité des écritures par rapport aux lectures peut ou non être atomique. Voici un résumé rapide par drapeaux, OS et système de classement:
Non O_DIRECT / FILE_FLAG_NO_BUFFERING:
Microsoft Windows 10 avec NTFS: mise à jour atomicité = 1 octet jusqu'à 10.0.10240 inclus, à partir de 10.0.14393 au moins 1 Mo, probablement infini (*).
Linux 4.2.6 avec ext4: mise à jour de l'atomicité = 1 octet
FreeBSD 10.2 avec ZFS: mise à jour de l'atomicité = au moins 1 Mo, probablement infini (*)
O_DIRECT / FILE_FLAG_NO_BUFFERING:
Microsoft Windows 10 avec NTFS: mise à jour atomicité = jusqu'à et y compris 10.0.10240 jusqu'à 4096 octets uniquement si la page est alignée, sinon 512 octets si FILE_FLAG_WRITE_THROUGH est désactivé, sinon 64 octets. Notez que cette atomicité est probablement une fonctionnalité de PCIe DMA plutôt que conçue. Depuis 10.0.14393, au moins 1 Mo, probablement infini (*).
Linux 4.2.6 avec ext4: mise à jour atomicité = au moins 1 Mo, probablement infini (*). Notez que les Linux précédents avec ext4 ne dépassaient certainement pas 4096 octets, XFS avait certainement un verrouillage personnalisé, mais il semble que Linux récent a finalement résolu ce problème.
FreeBSD 10.2 avec ZFS: mise à jour de l'atomicité = au moins 1 Mo, probablement infini (*)
Vous pouvez voir les résultats des tests empiriques bruts sur https://github.com/ned14/afio/tree/master/programs/fs-probe . Notez que nous testons les décalages déchirés uniquement sur des multiples de 512 octets, donc je ne peux pas dire si une mise à jour partielle d'un secteur de 512 octets se déchirerait pendant le cycle de lecture-modification-écriture.
Donc, pour répondre à la question du PO, les écritures O_APPEND n'interféreront pas les unes avec les autres, mais les lectures simultanées aux écritures O_APPEND verront probablement des écritures déchirées sur Linux avec ext4 à moins que O_DIRECT ne soit activé, après quoi vos écritures O_APPEND devront être d'un multiple de taille de secteur.
(*) "Probablement infini" provient de ces clauses de la spécification POSIX:
Toutes les fonctions suivantes doivent être atomiques les unes par rapport aux autres dans les effets spécifiés dans POSIX.1-2008 lorsqu'elles opèrent sur des fichiers normaux ou des liens symboliques ... [plusieurs fonctions] ... read () ... write ( ) ... Si deux threads appellent chacun l'une de ces fonctions, chaque appel verra soit tous les effets spécifiés de l'autre appel, soit aucun d'entre eux. [La source]
et
Les écritures peuvent être sérialisées par rapport à d'autres lectures et écritures. Si une lecture () de données de fichier peut être prouvée (par n'importe quel moyen) après une écriture () des données, elle doit refléter cette écriture (), même si les appels sont effectués par des processus différents. [La source]
mais inversement:
Ce volume de POSIX.1-2008 ne spécifie pas le comportement des écritures simultanées dans un fichier à partir de plusieurs processus. Les applications doivent utiliser une forme de contrôle d'accès concurrentiel. [La source]
Vous pouvez en savoir plus sur la signification de ceux-ci dans cette réponse
fsync(2)
donne autant de garantie que lesync(2)
fait et n'a pas autant d'impact sur les performances.