È l'implementazione di glibc di fprintf) (thread-safe?
-
09-09-2019 - |
Domanda
È fprintf thread-safe? Il manuale glibc sembra dire che è , ma la mia domanda, che scrive in un file utilizzando singola chiamata a f printf () sembra essere mescolanza scrive parziali provenienti da diversi processi.
Modifica: Per chiarire, il programma in questione è un lighttpd plug-in, e il server è in esecuzione con più thread di lavoro.
Guardando il file, alcune delle operazioni di scrittura si mescolano.
modifica 2: Sembra che il problema che sto vedendo potrebbe essere causa di "thread di lavoro" di lighttpd effettivamente processi separati: http: //redmine.lighttpd. net / wiki / lighttpd / Documenti: MultiProcessor
Problemi |
Con l'esecuzione di 2 o più processi sul stessa presa si avrà una migliore concorrenza, ma avrà un paio di svantaggi che si deve essere a conoscenza di:
- mod_accesslog potrebbe creare registri di accesso rotti, come lo stesso file viene aperto due volte e non è sincronizzato.
- mod_status avrà n contatori separati, un set per ogni processo.
- mod_rrdtool fallirà in quanto riceve lo stesso timestamp due volte.
- mod_uploadprogress non mostrerà stato corretto.
Soluzione
Si sta confondendo due concetti -. Scrittura da più thread e la scrittura da più processi
All'interno di un processo il suo possibile per assicurare che una chiamata di fprintf è completata prima del successivo è consentito l'accesso al buffer di uscita, ma una volta che la vostra applicazione pompe che output a un file si è in balia del sistema operativo. Senza un qualche tipo di meccanismo di bloccaggio con sistema operativo non puoi garantire che un completamente diverso doesnt applicazione scrivere al file di log.
Altri suggerimenti
Sembra a me come avete bisogno di leggere il blocco dei file . Il problema che ho è che più processi (cioè non thread) stanno scrivendo allo stesso file contemporaneamente e non v'è alcun modo affidabile per assicurare le operazioni di scrittura sarà atomica. Ciò può portare a file sovrascrivendo l'un l'altro scrive, uscita misti, e il comportamento del tutto non-deterministico.
Questo non ha nulla a che fare con la sicurezza Filo, in quanto questo è rilevante solo nei programmi multithreading singolo processo.
L'attuale standard di C ++ dice nulla di utile su concorrenza, né lo standard 1990, C. (Non ho letto lo standard C del 1999, quindi non posso commentare su di esso;. Il moderno standard C ++ 0x fa dire le cose, ma non so esattamente cosa offhand)
Questo significa che fprintf () stesso è probabile né thread-safe né altrimenti, e che sarebbe dipenderà dall'applicazione. Avevo letto esattamente ciò che dice la documentazione glibc su di esso, e confrontarlo con esattamente quello che stai facendo.