pread本身是线程安全的,因为它不在不安全的函数列表中.所以打电话是安全的.
真正的问题是:如果您同时从同一个文件中读取(不一定来自两个线程,而且来自两个进程)会发生什么.
对此,规范说:
未指定同一管道,FIFO或终端设备上的多个并发读取的行为.
请注意,它没有提到普通文件.这个位只涉及到read任何方式,因为pread不能用于不可见的文件.
I/O旨在成为普通文件和管道以及FIFO的原子.
但这来自非规范部分,因此您的操作系统可能会采用不同的方式.例如,如果您从两个线程读取并且存在并发写入,则可能会在两个读取缓冲区中获得不同的写入部分.但是这种问题并不是多线程所特有的.
也很高兴知道在某些情况下
read()将阻塞调用线程
不是流程,只是线程.和
已阻塞的线程不得阻止任何未阻塞的线程最终进行前进