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

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

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

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

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

所以Page1:AAAA

第2页:BBBB …..等等

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

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

从手册页我明白,读取也会增加文件指针,所以我肯定会得到像#的乱码

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

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

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

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

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

线程1读取:AAAA线程2读取:BBBB线程3读取:CCCC …没有实际拼接内容..

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

但它不是很有用。

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

任何帮助将不胜感激

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

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

fcntl顾问锁是文件范围内的锁。 您可能会发现这对于序列化对同一区域的读取和写入非常有用,同时允许在不同区域上进行并发。

 int rc; struct flock f; f.l_type = F_RDLCK; /* or F_WRLCK */ f.l_whence = SEEK_SET; f.l_start = n; f.l_len = 1; while ((rc = fcntl(fd, F_SETLKW, &f)) == -1 && errno = EINTR) ; if (rc == -1) perror("fcntl(F_SETLKW)"); else { /* do stuff */ f.l_type = F_UNLCK; fcntl(fd, F_SETLK, &f); } 

一次允许多个读取器锁定,而单个写入器锁定阻止所有其他锁定。

请注意, 所有平台上的某些配置都会巧妙地破坏所有文件锁定机制 。

在两个线程之间共享一个互斥锁,在读取之前启用线程中的锁,并在正确的读取完成时解锁锁。 请参阅pthread_mutex_createpthread_mutex_lockpthread_mutex_unlock