Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ fread线程锁处于什么级别?他们需要处于什么级别?_C++_C_Multithreading_Io_Locking - Fatal编程技术网

C++ fread线程锁处于什么级别?他们需要处于什么级别?

C++ fread线程锁处于什么级别?他们需要处于什么级别?,c++,c,multithreading,io,locking,C++,C,Multithreading,Io,Locking,VisualStudio的fread“锁定其他线程”。还有一个替代版本_fread_nolock,其内容为“不锁定其他线程”,该版本只应“在线程安全上下文(如单线程应用程序)或调用作用域已处理线程隔离的情况下”使用 即使在阅读了关于这两个方面的其他相关讨论之后,我仍然不清楚fread实现的锁定是在特定的文件结构、特定的实际文件上,还是在完全不同的文件上的所有fread调用上 如果使用nolock版本,需要提供什么级别的锁定?多个线程可以并行地读取单独的文件而不进行任何锁定吗?多个线程可以并行地写

VisualStudio的fread“锁定其他线程”。还有一个替代版本_fread_nolock,其内容为“不锁定其他线程”,该版本只应“在线程安全上下文(如单线程应用程序)或调用作用域已处理线程隔离的情况下”使用

即使在阅读了关于这两个方面的其他相关讨论之后,我仍然不清楚fread实现的锁定是在特定的文件结构、特定的实际文件上,还是在完全不同的文件上的所有fread调用上

如果使用nolock版本,需要提供什么级别的锁定?多个线程可以并行地读取单独的文件而不进行任何锁定吗?多个线程可以并行地写入单独的文件而不进行任何锁定吗?或者是否存在可能损坏的全局或静态变量

因此,通过使用nolock版本,您是否能够潜在地实现更好的I/O吞吐量(如果您没有不必要地移动磁头,如读取单独的驱动器或SSD驱动器),或者潜在的收益只是将冗余锁减少为单个锁(这应该可以忽略不计)

VS'ifstream.read函数是否与常规fread一样工作?(我没有看到它的nolock版本。)

fread_no_lock()在您确保使用外部机制(可能是某种形式的互斥锁)锁定文件,然后使用它来减少开销后,就会使用它:相关:


这还可以回答您可能遇到的任何其他问题:根据您拥有的硬盘类型,您的硬盘驱动器是否可能同时执行多个I/O操作:

MS标准库实现完全支持多线程。C++标准解释了这个要求:

27.2.3:多线程并发访问流对象、流缓冲区对象或C库流可能导致数据丢失 比赛,除非另有规定

如果一个线程进行库调用,将值写入流 结果,另一个线程从流中读取该值 通过库调用b,这样不会导致数据丢失 race,则a的写入与b的读取同步

这意味着,如果在流上写入,将执行锁定(不是文件锁定,而是对内存中的流数据结构的并发访问锁定),以确保使用相同流的所有其他线程的并发性得到良好管理

这种锁定开销总是存在的,即使不需要。据微软称,这可能会影响性能:

多线程库的性能得到了改进和提高 接近现已淘汰的单线程系统的性能 图书馆。对于需要更高性能的情况 必要时,有几个新功能

这就是为什么提供了nolock函数。它们直接访问流而无需线程锁定。使用时必须格外小心,例如:

  • 如果您的应用程序是单线程的(使用同一流的另一个进程有自己的数据结构,这里的OS manageds并发)
  • 如果您确定没有两个线程使用同一个流(例如,如果您只有一个读卡器线程,并且写操作是在程序之外完成的)
  • 如果您有其他同步机制来保护代码的关键部分。例如,如果使用互斥锁,或者使用原子的线程安全非阻塞算法
在这种情况下,不需要/冗余流访问的附加锁。对于文件密集型函数,使用no_锁是值得的


注意:正如您所指出的:只有在进行数百万次访问的密集文件访问时才值得使用nolock

在发帖之前,我看到了一个问题“这个……的预期用途是什么”,我仍然感到困惑。O/P表示“thinking”函数(thinking意味着fread)会阻止重新进入的调用,允许一次将一个线程作为一个整体存在于函数中。但是,有一个答案表明锁定是在文件*级别。另一个答案是线程安全版本是可重入的,但不能用同一个文件调用两个版本*。另一个答案是使用nolock版本可以提高性能,但没有提到实际磁盘I/O是否更高,或者是否只是绕过了冗余锁。这给我留下了更多的问题。C运行库可以追溯到很久以前,在操作系统支持线程之前。规范从未更新过,说明当两个线程在同一个文件上调用fread()时会发生什么。因此,图书馆的作者们必须自力更生,才能使旧的规范发挥作用。它不像CRT给程序员提供了另一种方式。通过尝试绕过锁而实际领先的几率非常低,I/O相当慢。然而,并非所有情况下都是如此,例如,现场设置的费用就高得惊人。任何试图做对的程序的命运都是避免CRT。