Durante la risoluzione di alcuni problemi di prestazioni nelle nostre app, ho scoperto che le funzioni di C stdio.h
(e, almeno per il nostro fornitore, fstream
del C++) sono thread-safe. Di conseguenza, ogni volta che faccio qualcosa di semplice come fgetc
, RTL deve acquisire un blocco, leggere un byte e rilasciare il blocco.I/O file non protetto in C/C++
Questo non va bene per le prestazioni.
Qual è il modo migliore per ottenere I/O di file non protetti in C e C++, in modo da poter gestire il blocco e ottenere prestazioni migliori?
- MSVC fornisce
_fputc_nolock
, e GCC fornisceunlocked_stdio
eflockfile
, ma non riesco a trovare alcuna funzione simili nella mia compilatore (CodeGear C++ Builder). - Potrei usare l'API di Windows non funzionante, ma non è portabile e presumo che sarebbe più lento di un fgetc sbloccato per l'I/O caratteriale alla volta.
- Potrei passare a qualcosa di simile allo Apache Portable Runtime, ma potrebbe essere molto lavoro.
Come gli altri si avvicinano a questo?
Modifica: Poiché alcune persone si chiedevano, l'avevo provato prima di postare. fgetc
non effettua chiamate di sistema se è in grado di soddisfare le letture dal suo buffer, ma continua a bloccare, quindi il blocco termina con un'enorme percentuale di tempo (centinaia di blocchi da acquisire e rilasciare per un singolo blocco di dati letti dal disco). Non fare l'I/O di carattere alla volta sarebbe una soluzione, ma le classi fstream
del C++ Builder sfortunatamente usano fgetc (quindi se voglio usare le classi iostream
, sono bloccato con esso), e ho un sacco di codice legacy che utilizza fgetc
e amici per leggere i campi da file in stile record (che sarebbe ragionevole se non fosse per problemi di blocco).
Le funzioni stdio.h di C non sono thread-safe; anche quello è il tuo venditore. – MSalters
Non solo il mio venditore; POSIX, per esempio, lo richiede. –