读取/预制系统调用的线程安全性

Rah*_*mri 8 c multithreading asynchronous thread-safety

我在多线程环境中几乎没有与read()/ pread()系统调用相关的查询

我正在使用基于freeBsd的Mac-OSX,如果这有助于我在读模式下只使用这个文件,而不是读/写而且语言是c/c ++

假设我们在磁盘AAAABBBBCCCCDDDEEEE上有一个文件....

和4个字母适合文件的一页

所以Page1:AAAA

第2页:BBBB .....等等

现在我从具有相同文件描述符的两个不同线程发起读取系统调用,我的意图是从线程1读取第一页,从线程2读取第二页,等等.

阅读(FD,浅黄色,的sizeof(页));

从手册页我得知理解读取也会增加文件指针,所以我肯定会得到像我这样的乱码

ABCC ABBB ..等(没有特别的顺序)

为了解决这个问题,我可以使用pread()

"Pread()执行相同的功能,但从文件中的指定位置读取而不修改文件指针"//来自手册页

但我不确定使用pread是否真的会帮助我实现目标,因为即使它没有增加内部文件指针,也无法保证响应不会混乱.

我的所有数据都是页面对齐的,我想从每个线程中读取一页

线程1读取:AAAA线程2读取:BBBB线程3读取:CCCC ...没有实际乱画内容..

我还发现一个帖子一旦write()返回,从文件中读取是否安全?

但它不是很有用.

我也不确定read()是否真的会有问题,我正在考虑.我正在阅读的文件是一个二进制文件,因此我很难快速手动阅读和验证..

任何帮助将不胜感激

R..*_*R.. 9

readwrite更改基础打开文件的位置.它们是"线程安全的",因为如果多个线程使用它们同时在同一个打开的文件上执行IO,那么您的程序将不会有未定义的行为(崩溃或更糟),但操作的顺序和原子性可能会有所不同,具体取决于文件类型和实现.

另一方面,pread并且pwrite不要改变打开文件中的位置.它们被添加到POSIX中以达到您想要的目的:在多个线程或进程的同一个打开文件上执行IO操作,而不会使操作干扰彼此的位置.如果您正在混合preadpwrite(或多次调用pwrite)文件的重叠部分,您仍然会遇到一些排序问题,但只要您避免这种情况,它们对于您想要做的事情是完全安全的.