多线程编程指南

共享的 I/O 和新的 I/O 系统调用

多个线程执行具有相同文件描述符的并发 I/O 操作时,您可能会发现传统的 UNIX I/O 接口不是线程安全的。在 lseek(2) 系统调用设置了文件偏移的位置,会出现不连续 I/O 问题。随后将在接下来的 read(2)write(2) 调用中使用该文件偏移,以指示操作应在文件中的哪个位置开始。当两个或更多线程向同一文件描述符发出 lseeks() 时,将产生冲突。

为避免此冲突,请使用 pread(2)pwrite(2) 系统调用。

#include <sys/types.h>

#include <unistd.h>



ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);



ssize_t pwrite(int filedes, void *buf, size_t nbyte,

    off_t offset);

pread(2) 和 pwrite(2) 的行为方式与 read(2) 和 write(2) 非常类似,但是 pread(2) 和 pwrite(2) 多使用了一个参数(即文件偏移)。可以使用此参数来指定偏移,而无需使用 lseek(2),因此多个线程可以安全地使用这些例程来处理对同一文件描述符的 I/O。