C/C++中的非线程安全文件I/O.

Jos*_*ley 5 c c++ file-io multithreading

在对我们的应用程序中的一些性能问题进行故障排除时,我发现C的stdio.h功能(至少对我们的供应商来说,C++的fstream类)是线程安全的.因此,每次我做一些简单的操作时fgetc,RTL必须获取锁,读取一个字节并释放锁.

这对性能不利.

在C和C++中获取非线程安全文件I/O的最佳方法是什么,这样我可以自己管理锁定并获得更好的性能?

  • MSVC提供_fputc_nolock,和GCC提供unlocked_stdioflockfile,但我无法找到我的编译器(CodeGear的C++ Builder的)任何类似的功能.
  • 我可以使用原始Windows API,但这不是可移植的,我认为比一次性I/O的解锁fgetc慢.
  • 我可以切换到类似Apache Portable Runtime的东西,但这可能是很多工作.

其他人如何处理这个问题?

编辑:由于有些人想知道,我在发布前测试了这个. fgetc如果它可以满足从其缓冲区读取的数量,它不会进行系统调用,但它仍然会进行锁定,因此锁定会占用大量的时间(从磁盘读取的单个数据块需要数百个锁来获取和释放) .不做一次一个字符I/O将是一个解决方案,但fstream不幸的是C++ Builder的类使用fgetc(所以如果我想使用iostream类,我会坚持使用它),并且我有很多遗产使用fgetc和朋友从记录样式文件中读取字段的代码(如果不是锁定问题,这将是合理的).

APr*_*mer 4

如果出于合理的性能考虑,我不会一次对一个字符进行 IO 操作。