gpt4 book ai didi

c - 为什么 fread 确实有线程安全要求,这会减慢其调用速度

转载 作者:太空宇宙 更新时间:2023-11-04 04:19:20 34 4
gpt4 key购买 nike

我正在编写一个函数来读取二进制文件,这些文件被组织为连续的(键,值)对,其中键是小的 ASCII 字符串,值是以二进制格式存储的 int 或 double。

如果简单地实现,这个函数会多次调用 fread 来读取非常少量的数据(通常不超过 10 个字节)。尽管 fread 在内部使用缓冲区来读取文件,但我已经实现了自己的缓冲区,并且我观察到在 Linux 和 Windows 上速度都提高了 10 倍。 fread 使用的缓冲区大小足够大,函数调用不能对这种减速负责。所以我深入研究了 fread 的 GNU 实现并发现了文件上的一些锁,以及许多其他事情,例如验证文件是否已打开并具有读取权限等。难怪为什么 fread 这么慢。

但是 fread 是线程安全的背后的基本原理是什么,似乎多个线程可以在 相同 文件上调用 fread,这让我感到难以置信。这些要求使它变得非常慢。有什么优势?

最佳答案

假设您有一个文件,其中每 5 个字节都可以并行处理(比方说,图像中的一个像素一个像素):

123456789A

一个线程需要选择 5 个字节“12345”,下一个线程需要选择接下来的 5 个字节“6789A”。

如果它不是线程安全的,不同的线程可能会拾取错误的 block 。例如:“12367”和“4589A”甚至最差(意外行为、重复字节或最差)。

关于c - 为什么 fread 确实有线程安全要求,这会减慢其调用速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48291991/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com