10、线程和输入输出
在前面我们介绍了pread函数和pwrite函数,这些函数在多线程的环境中是非常有用的,因为进程中所有的线程共享同样的文件描述符号。
假设线程A和B在如下的情况同时读写文件:
- 线程A:lseek(fd, 300, SEEK_SET);read(fd, buf1, 100);
- 线程B:lseek(fd, 700, SEEK_SET);read(fd, buf2, 100);
如果线程A在调用完lseek之后,但是read之前的时候,线程B调用了lseek,那么两个线程将会读取同样的数据,显然这样的结果很可能就不是我们所需要的了。
为了解决上述问题,我们使用pread,这个函数将lseek和read合并为一个原子的操作:
- 线程A:pread(fd, buf1, 100, 300);
- 线程B:pread(fd, buf2, 100, 700);
使用线程A,我们就可以保证线程A从300开始读取,而线程B一定是从700开始读取。同理,我们可以使用pwrite来解决多个线程同时写同一个文件导致的竞争条件。
译者注
原文参考
11、总结
线程提供了在unix系统中将一个任务分割的可选的途径.使用线程,可以在各个线程之间方便地共享数据,但是也会引入一些同步的问题。在本章,我们介绍了如何使用线程并且处理这些线程之间的同步问题,我们也讨论了线程中存在的可重入性.我们也看到了线程如何和一些面向进程级别的系统调用进行交互。