3.11节介绍了pread
和pwrite
函数。这些函数在多线程环境下是非常有用的,因为进程中的所有线程共享相同的文件描述符。
考虑两个线程,在同一时间对同一个文件描述符进行读写操作。
线程A | 线程B |
---|---|
lseek(fd, 300, SEEK_SET); | lseek(fd, 700,SEEK_SET); |
read(fd, buf1, 100); | read(fd, buf2,100); |
如果线程A执行lseek
然后线程B在线程A调用read
之前调用lseek
,那么两个线程最终会读取同一条记录。很显然这不是我们希望的。
为了解决这个问题,可以使用pread
,使偏移量的设定和数据的读取成为一个原子操作。
线程A | 线程B |
---|---|
pread(fd, buf1, 100, 300); | pread(fd,buf2, 100, 700); |
使用pread
可以确保线程A读取偏移量为300
的记录,而线程B读取偏移量为700
的记录。可以使用pwrite
来解决并发线程对同一文件进行写操作的问题。