Risorsa condivisa ==Contesa
La scrittura in un file normale per definizione è un'operazione serializzata. Non ottieni prestazioni provando a scriverci da più thread, l'I/O è una risorsa limitata di ordini di grandezza inferiore alla larghezza di banda anche della CPU più lenta o sovraccaricata.
L'accesso simultaneo a una risorsa condivisa può essere complicato (e lento)
Se hai più thread che stanno facendo calcoli costosi, hai delle opzioni, se stai solo usando più thread perché pensi di accelerare qualcosa, farai semplicemente il contrario. La contesa per l'I/O rallenta sempre l'accesso alla risorsa, non lo accelera mai a causa delle attese di blocco e di altro sovraccarico.
Devi avere una sezione critica che sia protetta e consenta solo un singolo scrittore alla volta. Basta cercare il codice sorgente per qualsiasi writer di registrazione che supporti la concorrenza e vedrai che esiste un solo thread che scrive nel file.
Se la tua domanda è principalmente:
-
CPU vincolato: È possibile utilizzare un meccanismo di blocco/costrutto di dati per consentire solo a un thread su molti di scrivere sul file alla volta, il che sarà inutile dal punto di vista della concorrenza come soluzione ingenua; Se questi thread sono associati alla CPU con poco I/O, questo potrebbe funzionare.
-
I/O vincolato: Questo è il caso più comune, è necessario utilizzare un sistema di passaggio di messaggistica con una coda di qualche tipo e fare in modo che tutti i thread vengano inviati a una coda/buffer e che un singolo thread estragga da esso e scriva sul file. Questa sarà la soluzione più scalabile e più facile da implementare.
Journaling - Scritture asincrone
Se devi creare un unico file super grande in cui l'ordine delle scritture non è importante e il programma è vincolato alla CPU, puoi utilizzare una tecnica di journaling.
Avere ogni process
scrivere in un file separato e quindi concatenare più file in un unico file di grandi dimensioni alla fine. Questa è una scuola molto vecchia low tech soluzione che funziona bene e funziona da decenni.
Ovviamente più I/O di archiviazione hai, migliori saranno le prestazioni alla fine concat.