Ressource partagée ==Conflit
L'écriture dans un fichier normal est par définition une opération sérialisée. Vous ne gagnez aucune performance en essayant d'y écrire à partir de plusieurs threads, les E/S sont une ressource limitée limitée à des ordres de grandeur inférieurs à la bande passante que même le processeur le plus lent ou le plus surchargé.
L'accès simultané à une ressource partagée peut être compliqué (et lent)
Si vous avez plusieurs threads qui effectuent des calculs coûteux, vous avez des options, si vous utilisez simplement plusieurs threads parce que vous pensez que vous allez accélérer quelque chose, vous allez simplement faire le contraire. Les conflits d'E/S ralentissent toujours l'accès à la ressource, ils ne l'accélèrent jamais en raison des attentes de verrouillage et d'autres surcharges.
Vous devez avoir une section critique qui est protégée et qui n'autorise qu'un seul rédacteur à la fois. Recherchez simplement le code source de tout éditeur de journalisation prenant en charge la simultanéité et vous verrez qu'il n'y a qu'un seul thread qui écrit dans le fichier.
Si votre application est principalement :
-
Lié au processeur : Vous pouvez utiliser un mécanisme de verrouillage/construction de données pour ne laisser qu'un seul thread parmi plusieurs écrire dans le fichier à la fois, ce qui sera inutile du point de vue de la concurrence en tant que solution naïve ; Si ces threads sont liés au processeur avec peu d'E/S, cela pourrait fonctionner.
-
Liaison E/S : C'est le cas le plus courant, vous devez utiliser un système de transmission de messages avec une sorte de file d'attente et faire publier tous les threads dans une file d'attente/tampon et en tirer un seul thread et écrire dans le fichier. Ce sera la solution la plus évolutive et la plus facile à mettre en œuvre.
Journalisation - Écritures asynchrones
Si vous avez besoin de créer un seul fichier très volumineux où l'ordre des écritures n'a pas d'importance et où le programme est lié au processeur, vous pouvez utiliser une technique de journalisation.
Demandez à chaque process
écrire dans un fichier séparé, puis concaténer les multiples fichiers en un seul gros fichier à la fin. C'est une très vieille école low tech solution qui fonctionne bien et qui dure depuis des décennies.
Évidemment, plus vous avez d'E/S de stockage, mieux cela fonctionnera sur le concat final.