【发布时间】:2015-04-25 21:21:24
【问题描述】:
Visual Studio 的 fread “锁定其他线程”。还有一个替代版本 _fread_nolock,读作“不锁定其他线程”,只能在“线程安全上下文中使用,例如单线程应用程序或调用范围已经处理线程隔离的地方”。
即使在阅读了关于这两者的其他一些相关的讨论之后,我还是很困惑,如果锁定 fread 实现是在特定的 FILE 结构、特定的实际文件上,还是在完全不同文件上的所有 fread 调用上。
如果您使用 nolock 版本,您需要提供什么级别的锁定?多个线程可以在没有任何锁定的情况下并行读取单独的文件吗?多个线程可以在没有任何锁定的情况下并行编写单独的文件吗?或者是否存在会损坏的全局或静态变量?
那么,通过使用 nolock 版本,您是否能够潜在地实现更好的 I/O 吞吐量(如果您没有不必要地移动磁头,例如读取单独的驱动器或 SSD 驱动器),或者潜在的收益仅仅是将冗余锁减少为单个锁(应该可以忽略不计。)
VS 的 ifstream.read 函数是否像普通的 fread 一样工作? (我没有看到它的 nolock 版本。)
【问题讨论】:
-
C 运行时库可以追溯到很久很久以前,早在操作系统支持线程之前。当两个线程在同一个文件上调用 fread() 时,规范从未更新说明 应该 发生什么。因此,图书馆作者必须自谋生路才能使旧规范发挥作用。不像 CRT 给了程序员另一种方式。通过尝试绕过锁,您实际上领先的几率非常低,I/O 非常慢。然而,这并非在所有情况下都是如此,例如,语言环境非常昂贵。大多数试图做正确的程序的命运都是避免 CRT。
标签: c++ c multithreading io locking