PREAD;线程安全与否?

时间:2011-03-01 14:16:56

标签: c multithreading posix

在两个或多个不同线程的同一个文件描述符上同时使用pread是否有问题?

3 个答案:

答案 0 :(得分:8)

pread本身是线程安全的,因为它不在list of unsafe functions上。所以打电话是安全的。

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

对此,specification说:

  •   

    未指定同一管道,FIFO或终端设备上的多个并发读取的行为。

    请注意,它没有提到普通文件。无论如何,此位仅与read相关,因为pread无法用于不可搜索的文件。

  •   

    I / O旨在成为普通文件和管道以及FIFO的原子。

    但这是来自非规范部分,因此您的操作系统可能会采用不同的方式。例如,如果您从两个线程读取并且存在并发写入,则可能会在两个读取缓冲区中获得不同的写入部分。但是这种问题并不是多线程特有的。

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

  

read()将阻止调用线程

不是流程,只是线程。和

  

已阻止的线程不得阻止任何未阻塞的线程最终向前推进

答案 1 :(得分:-1)

当我们使用相同的fd时,我们必须绑定一个锁,否则会有来自文件描述符上两个pread的数据混合。 因此,这样做有一个问题

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

答案 2 :(得分:-3)

我不是100%肯定,但我认为文件描述符结构本身不是线程安全的,因此对它进行两次并发更改会破坏它。你需要某种锁定。