2010-02-08 16 views
10

Una domanda semplice:Fwrite è atomico?

Ho bisogno di aggiungere qualche registrazione al mio programma.

Se due processi utilizzano "fwrite" sullo stesso file ma non lo stesso descrittore di file, i messaggi di log scritti saranno atomici o misti. C'è un limite di lunghezza?

È definito comportamento ANSI-C o implementazione definita? Se più tardi cosa è su MacOSX, Linux e Windows MSVC?

+0

Per esperienza, le attività con priorità più alta/discussione avrà luogo il loro testo da qualche parte nel testo di un thread con priorità più bassa. Questo può essere risolto avendo un output di attività da una coda e un'altra attività accodata alla coda. –

risposta

3

Può essere miscelato.

Se si ha più di una scrittura thread/processo sullo stesso file, è necessario utilizzare il blocco.

Un'alternativa è inviare messaggi di registro a un servizio/thread dedicato. Uno strumento eccellente da adottare è syslog, che è sicuramente installato su tutti gli unix e può essere eseguito su Windows.

14

Dopo aver fatto qualche ricerca e ho trovato quanto segue in questo link:

standard POSIX richiede che C stdio FILE * operazioni sono atomiche. Le librerie C conformi a POSIX (ad esempio, su Solaris e GNU/Linux) hanno un mutex interno per serializzare le operazioni su FILE * s.

Sembra che le chiamate debbano essere atomiche, ma dipende dalla piattaforma. In stesso link, v'è anche un altro paragrafo che consente di pensare che il programmatore dovrebbe prendersi cura:

Così, per 3,0, la questione del "è multithreading sicuro per I/O" deve essere risposto con, "la libreria C della tua piattaforma è protetta da thread-safe per I/O?" Alcuni sono per impostazione predefinita, altri no; molti offrono implementazioni multiple della libreria C con vari compromessi di sicurezza ed efficienza dei thread. Tu, il programmatore , sei sempre obbligato a fare attenzione con più thread.

Inoltre, poiché si dispone di due diversi FILE* in due processi diversi, penso che non si abbia scelta.

+0

Ma ogni processo ha il proprio FILE? – Will

+0

@Will: il tuo diritto. Aggiornato, grazie! – yeyeyerman

+1

Anche su Windows, 'fwrite' è atomico.[fonte] (https://msdn.microsoft.com/en-us/library/h9t88zwz.aspx?f=255&MSPPError=-2147217396): * Poiché questa funzione blocca il thread chiamante, è thread-safe. Per una versione non bloccante, vedi _fwrite_nolock. * – rustyx

1

Da "man flockfile" su Debian lenny, le funzioni stdio sono thread-safe.

Esistono funzioni stdio non valide per il thread, "man unlocked_stdio" per ulteriori dettagli.

È possibile ottenere ulteriori informazioni dalla pagina man.

-1

fwrite per Visual Studio blocca il thread chiamante ed è quindi thread-safe