Al solucionar algunos problemas de rendimiento en nuestras aplicaciones, descubrí que las funciones de C stdio.h
(y, al menos para nuestro proveedor, las clases fstream
de C++) son seguras para los hilos. Como resultado, cada vez que hago algo tan simple como fgetc
, el RTL tiene que adquirir un bloqueo, leer un byte y liberar el bloqueo.E/S de archivo sin hilos en C/C++
Esto no es bueno para el rendimiento.
¿Cuál es la mejor forma de obtener E/S de archivos que no sean de rosca en C y C++, para que pueda administrar el bloqueo y obtener un mejor rendimiento?
- MSVC ofrece
_fputc_nolock
, y GCC proporcionaunlocked_stdio
yflockfile
, pero no puedo encontrar ningún funciones similares en mi compilador (CodeGear C++ Builder). - Podría usar la API de Windows sin procesar, pero eso no es portátil y supongo que sería más lento que un fgetc desbloqueado para la E/S de carácter a la vez.
- Podría cambiar a algo como el Apache Portable Runtime, pero eso podría ser mucho trabajo.
¿Cómo se acercan los demás a esto?
Editar: Dado que algunas personas se preguntaban, había probado esto antes de publicarlo. fgetc
no hace llamadas al sistema si puede satisfacer las lecturas de su búfer, pero aún así bloquea, por lo que el bloqueo termina tomando un enorme porcentaje de tiempo (cientos de bloqueos para adquirir y liberar un solo bloque de datos leídos del disco)) No hacer una E/S de personaje a personaje sería una solución, pero las clases fstream
de C++ Builder desafortunadamente usan fgetc (así que si quiero usar las clases iostream
, estoy atascado), y tengo mucho del código heredado que usa fgetc
y amigos para leer los campos de los archivos de estilo de registro (lo que sería razonable si no fuera por problemas de bloqueo).
Las funciones stdio.h de C no son seguras para hilos; ese es tu vendedor también. – MSalters
No solo mi proveedor; POSIX, por ejemplo, lo requiere. –