gpt4 book ai didi

c++ - 多个线程/进程可以在不同步的情况下同时读取/写入文件的非重叠区域吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:22:43 24 4
gpt4 key购买 nike

我想知道 Linux 读/写系统调用是否支持从多个线程或进程对单个磁盘文件的非重叠区域进行非同步读/写(非附加写入)。每个线程将寻找它自己的文件区域,并独占地访问该区域,永远不会与其他线程正在操作的区域重叠。

最佳答案

I'd like to know if linux read/write system calls supports unsynchronized reads/writes (non-appending writes) to non-overlapping regions of a single disk file from multiple threads or processes. Each thread will seek to its own region of the file, and read/write from/to this region exclusively, never overlapping the regions that other threads are operating on.

POSIX 在 XSH 2.9.7 中指定基本上所有 I/O 函数就其 POSIX 指定的效果而言彼此都是原子的。给出了一长串适用于它的特定函数,以及 open()lseek()read()write(), close() 都在上面。因此,

If two threads each call one of these functions, each call shall either see all of the specified effects of the other call, or none of them.

这不依赖于任何外部同步,即使对于与相同打开文件描述关联的文件描述符的操作也是如此。

同一个文件可以有多个打开的文件描述,即使在一个进程中也是如此(例如,参见 open(2) 的手册页)。给定多个线程对同一常规文件的非重叠区域执行read()write() 操作,通过引用不同打开文件描述的文件描述符,POSIX 没有提供预期这些操作相互干扰的基础,无论所涉及线程的外部同步如何。在实践中,它工作正常。

您可能会遇到麻烦的地方是,如果涉及的线程试图使用引用相同打开文件描述的文件描述符。这些不必是相同的文件描述符值(因此 dup()ing 文件描述符在这里没有帮助),线程也不必属于同一进程才会出现这种情况。每个打开的文件描述都有一个关联的文件位置,因此如果两个不同的线程试图执行每个任务都需要分别设置文件偏移量并向文件传输数据或从文件传输数据,并且如果它们正在使用相同的打开文件描述,那么单个函数调用的原子性不足以确保在预期位置执行读取和写入。在这种情况下需要同步。

或者,正如@maximegorushkin 在评论中观察到的和@bk2204 在另一个答案中观察到的那样,pread()pwrite() 函数在一个单一的过程中执行定位和数据传输称呼。这些也在原子 I/O 函数列表中,它们克服了在每次数据传输的基础上定位与数据传输的分离。使用它们需要格外小心和记账,并且在某些情况下它不能充分服务,但对于所讨论的特定情况它可能仍然可行。

因此,如果两个不同的线程想要在不同步的情况下操作同一个文件,那么最安全和最通用的方法是每个线程独立打开文件。只要它们的 I/O 操作被限制在文件的不相交区域,它们就不会相互干扰。即使对文件的重叠区域进行操作也不是不可能的,但这会引入更复杂的、特定于应用程序的考虑因素。

关于c++ - 多个线程/进程可以在不同步的情况下同时读取/写入文件的非重叠区域吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57739849/

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