一:概念
在一个进程当中所有的线程共享文件描述符。
思考:若存在一下情形,
线程A:
lseek(fd, 300, SEEK_SET);
read(fd, buf1, 100);
线程B:
lseek(fd, 700, SEEK_SET);
read(fd, buf2, 100);
在一个进程当中有线程AB,如果在执行到线程A当中的lseek函数时,突然上下文切换,且到线程B当中,执行完了lseek函数和read函数,这个时候才切回线程A的read函数,那么这个时候,偏移量就是700了,就不是原来的线程A所希望的300偏移量了。
解决:
线程A:
pread(fd, buf1, 100, 300);
线程B:
pread(fd, buf2, 100, 700);
使用pread可以确保线程A读取偏移量为300的记录,而线程B读取偏移量为700的记录。可以使用pwrite来解决并发线程对同一文件进行写操作的问题。
(原子操作)