Si deux threads ouvrent tous les deux le même fichier avec fopen()
, ils auront chacun des flux de fichiers indépendants (FILE *
) soutenus par des descripteurs de fichiers indépendants faisant référence au même fichier. Vous pouvez écrire indépendamment dans les deux flux de fichiers, mais le résultat net sur le fichier dépendra de l'endroit où les threads écrivent et du moment où ils vident le flux de fichiers. Les résultats sont imprévisibles à moins que vous ne contrôliez où chaque thread écrit. La chose la plus simple est de s'assurer que les deux threads utilisent le même flux de fichiers, mais vous avez probablement encore besoin de coordonner les threads. Notez que POSIX nécessite que les fonctions C donnent un accès coordonné au flux de fichiers — voir flockfile()
qui impose l'exigence que
Toutes les fonctions qui référencent
(FILE *)
objets, sauf ceux dont le nom se termine par_unlocked
, doivent se comporter comme s'ils utilisaientflockfile()
etfunlockfile()
en interne pour obtenir la propriété de ces objets (FILE*).
Si vous ouvrez le fichier en mode ajout dans les deux threads, les écritures se feront en toute sécurité à la fin du fichier à chaque fois, mais vous devez toujours vous soucier de vider les données avant que le tampon ne se remplisse.
Accessoirement, si vous ouvrez le fichier en mode ajout (O_APPEND
avec open()
, en utilisant "a"
avec fopen()
), alors toutes les écritures doivent être à la fin du fichier, et vous ne devriez pas avoir de problèmes avec les écritures entrelacées - à moins, peut-être, que vos threads indépendants utilisent des flux de fichiers et écrivent plus d'un tampon plein à la fois, ou qu'ils utilisent fflush()
après avoir écrit des parties de chaque ligne de sortie, ou ils utilisent write()
ou l'un de ses innombrables parents à écrire des parties d'une ligne à chaque fois. Il existe des moyens de rencontrer des problèmes même avec le mode ajout, mais vous devez généralement essayer de les rencontrer.
fopen()
est réentrable , et vous pouvez avoir autant de descripteurs pointant vers le même fichier que vous le souhaitez.
Ce que vous obtenez à la suite de la lecture/écriture depuis/vers le fichier à l'aide de plusieurs descripteurs n'est pas une question de sécurité des threads, mais plutôt un accès simultané au fichier, qui dans la plupart des cas (sauf lorsque le fichier est en lecture seule) ne fonctionnera pas bien.