2011-03-01 87 views

回答

8

pread本身是线程安全的问题,因为它不是在list of unsafe functions。所以称它是安全的。

真正的问题是:如果您同时从同一文件读取(不一定来自两个线程,而且来自两个进程),会发生什么情况。

对此,specification说:

  • 多个并发的行为读取同一管道,FIFO,或终端装置是不确定的。

    请注意,它没有提到普通文件。无论如何,这个位仅与read有关,因为pread不能用于不可查看的文件。

  • I/O旨在对普通文件和管道以及FIFO进行原子操作。

    但是这是来自非规范部分,所以你的操作系统可能会做不同的。例如,如果你从两个线程读取并且有一个并发写入,你可能会在你的两个读缓冲区中得到不同的写入片段。但是这种问题并不是特定于多线程的。

也很高兴知道,在某些情况下

的read()将阻塞调用线程

不是过程,只是线程。而

已封锁不得阻止任何畅通线程的线程[...]从最终使得向前进步

-3

我不是100%确定的,但我认为文件描述符结构本身不是线程安全的,所以两个并发的更改会破坏它。你需要某种锁定。

+2

有没有结构损坏的应用方面,文件描述符只是一个数字。 – aaz 2011-03-01 14:49:47

+0

它实际上是一个带有数据结构的表中的索引。谁改变了桌子? C运行时还是内核?如果C运行时更新当前文件偏移量,则它是不安全的。如果它是内核,那么它​​可能是线程安全的。 – 2011-03-01 20:15:08

+0

文件描述符表位于内核中,C运行库无法访问它。当然,内核代码必须是线程安全的。 – mark4o 2011-03-01 22:38:22

0

由于我们使用相同的fd,我们必须绑定一个锁,否则会在文件描述符中混合来自两个pread的数据。 因此是有在做这个

http://linux.die.net/man/2/pread

+3

这不是4汉。回答时请使用英文语法和拼写,以便即使不是你的'兄弟'的人也能理解你。 – RedX 2011-03-01 14:37:43

+0

这个答案是错误的。 'pread'的全部目的是指定你想要读取的位置,而其他线程/进程产生的位置变化不会影响你的读取。请注意,这只适用于普通文件和其他可搜索设备,而不是管道/ ttys /套接字/等。 – 2011-04-13 15:50:15