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.
  •   
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top