在两个或多个不同线程的同一个文件描述符上同时使用pread是否有问题?
答案 0 :(得分:8)
pread
本身是线程安全的,因为它不在list of unsafe functions上。所以打电话是安全的。
真正的问题是:如果您同时从同一个文件中读取(不一定来自两个线程,而且来自两个进程)会发生什么。
对此,specification说:
未指定同一管道,FIFO或终端设备上的多个并发读取的行为。
请注意,它没有提到普通文件。无论如何,此位仅与read
相关,因为pread
无法用于不可搜索的文件。
I / O旨在成为普通文件和管道以及FIFO的原子。
但这是来自非规范部分,因此您的操作系统可能会采用不同的方式。例如,如果您从两个线程读取并且存在并发写入,则可能会在两个读取缓冲区中获得不同的写入部分。但是这种问题并不是多线程特有的。
也很高兴知道在某些情况下
read()将阻止调用线程
不是流程,只是线程。和
已阻止的线程不得阻止任何未阻塞的线程最终向前推进
答案 1 :(得分:-1)
当我们使用相同的fd时,我们必须绑定一个锁,否则会有来自文件描述符上两个pread的数据混合。 因此,这样做有一个问题
答案 2 :(得分:-3)
我不是100%肯定,但我认为文件描述符结构本身不是线程安全的,因此对它进行两次并发更改会破坏它。你需要某种锁定。