分类: 系统运维
2012-03-31 23:25:24
我们在3.11节介绍了pread和pwrite。这些函数有助于多线程环境,因为进程里的所有线程共享相同的文件描述符。
考虑两个线程同时读或写一个相同的文件。
线程A:
lseek(fd, 300, SEEK_SET);
read(fd, buf1, 100);
线程B:
lseek(fd, 700, SEEK_SET);
read(fd, buf2, 100);
如果线程A执行lseek然后线程B在线程A调用read前调用lseek,那么两个线程最终都读到相同的记录。很明显,这不是我们想要的。
为了解决这个问题,我们可以使用pthread来让偏移量的设置和数据的读成为一个原子操作。
线程A:pread(fd, buf1, 100, 300);
线程B:pread(fd, buf2, 100, 700);
使用pread,我们可以确保线程A读取偏移量300的数据而线程B读取偏移量为700的数据。我们可以使用pwrite来解决并发线程写相同文件的问题。