gpt4 book ai didi

c - C read() 线程安全吗?

转载 作者:太空狗 更新时间:2023-10-29 11:04:12 31 4
gpt4 key购买 nike

我正在编写一个程序,其中多个线程可能同时从一个文件中读取。没有线程正在写入文件,但它们可能各自将其内容复制到单独的内存段。

要实现这一点,我需要使用一个 API,为我想要读取的文件提供一个文件描述符。我正在用 C 的 read 读取文件 block 功能。手册页说,“成功时,返回读取的字节数(零表示文件结尾),文件位置按此数字前进。”但是,关于文件位置的推进是否线程安全,我找不到任何确定的信息。

假设我有线程 T1 和线程 T2 一次读取文件的 1 个字节。如果 read() 是线程安全的,我期望如下:

T1: read() => file position == 1
T2: read() => file position == 1
T1: read() => file position == 2
T2: read() => file position == 2
...

但我担心如果它不是线程安全的,那么可能会发生以下情况:

T1: read() => file position == 1
T2: read() => file position == 2
T1: read() => file position == 3
T2: read() => file position == 4
...

如果有帮助,每个线程将使用相同的文件描述符。换句话说,它是使用 open() 打开文件的 API。正在读取文件的线程然后根据客户端请求获取该文件描述符。如果每个线程都存储自己的文件位置信息,那么应该没问题。我只是找不到任何关于保存文件位置的信息,以及 read() 找出它是什么的信息。

最佳答案

read 本身是线程安全的,但这并不一定意味着您想用它做的事情是线程安全的。根据 POSIX(2.9.7 Thread Interactions with Regular File Operations):

All of the following functions shall be atomic with respect to each other in the effects specified in POSIX.1-2008 when they operate on regular files or symbolic links:

...

(read 在后面的列表中。)

除其他外,这意味着读取数据和推进当前文件位置是彼此原子的,并且读取的每个字节都将被读取一次。但是,还有其他考虑因素可能会使您的事情复杂化,尤其是:

  • 短读取:read(fd, buf, n) 不需要读取 n 个字节。它可以读取 1 到 n 字节之间的任何位置,当您再次调用它读取剩余部分时,第二次读取相对于第一次读取不再是原子的。

  • 其他文件类型:POSIX 仅保证常规文件和其他一些类型的read 的原子性。像 Linux 这样的特定系统可能有更强的保证,但我会谨慎。

最好使用 pread 函数(您可以在其中指定要从中读取的文件偏移量,而无需寻找该位置,并且生成的文件位于位置保持不变)或对文件访问进行锁定以避免此类问题。

关于c - C read() 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29331651/

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