在解决我们应用程序中的一些性能问题时,我发现 C 的stdio.h
函数(至少对于我们的供应商来说,C++ 的fstream
类)是线程安全的。结果,每次我做一些简单的事情时fgetc
,RTL 必须获取锁,读取一个字节,然后释放锁。
这对性能不利。
在 C 和 C++ 中获得非线程安全文件 I/O 的最佳方法是什么,以便我可以自己管理锁定并获得更好的性能?
- MSVC提供_fputc_nolock http://msdn.microsoft.com/en-us/library/xt5h2ba7.aspx,并且海湾合作委员会提供unlocked_stdio http://linux.die.net/man/3/unlocked_stdio and flockfile http://linux.die.net/man/3/flockfile,但我在我的编译器(CodeGear C++Builder)中找不到任何类似的函数。
- 我可以使用原始的 Windows API,但它不可移植,并且我认为对于一次字符 I/O 会比未锁定的 fgetc 慢。
- 我可以切换到类似的东西Apache 便携式运行时 http://apr.apache.org/,但这可能需要大量工作。
其他人如何处理这个问题?
Edit: 由于有些人想知道,我在发布之前已经对此进行了测试。fgetc
如果它可以满足从缓冲区的读取,则不会执行系统调用,但它仍然会执行锁定,因此锁定最终会花费大量时间(从磁盘读取的单个数据块需要获取和释放数百个锁) 。不进行一次字符 I/O 是一个解决方案,但 C++Builder 的fstream
不幸的是,类使用 fgetc (所以如果我想使用iostream
类,我坚持下去),并且我有很多使用的遗留代码fgetc
和朋友从记录式文件中读取字段(如果不是因为锁定问题,这将是合理的)。
如果是明智的性能明智的话,我根本不会一次执行 IO 一个字符。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)