请假设如下场景(OS = Redhat Linux),
选择:
写线程:使用FD=1写入文件。设置std::atomic
编辑更清楚:写完成使用写C函数调用。https://www.man7.org/linux/man-pages/man2/write.2.html
读线程:使用不同的FD读取上面的文件=2在上面的值保存std::atomic
那么我假定有可能,上面的读线程NOT能够读取由写入线程写入的所有数据(例如,FD=2的read调用可以返回较少的字节数)。因为可以在FD级别进行缓冲。
======================================================================================
选项B:
写线程:使用FD=1写入文件。设置std::atomic
编辑更清晰:只追加完成(不覆盖)发生)。写完成使用写C函数调用。https://www.man7.org/linux/man-pages/man2/write.2.html
读线程:读取(使用读取))上面的文件使用相同的FD=1在上面的值保存std::atomic
https://man7.org/linux/man-pages/man2/pwrite.2.html
现在,是否保证所有的数据写入线程被读取
缓冲处于libc
级别,在将数据交给内核之前保留数据。pread
是一个系统调用,它只会给你已经显示给内核的数据。
所以没有。pread
为您节省了额外的seek+read调用,它不解决任何缓冲问题。
你如何确保内核能够看到你的数据?您没有显示您的编写器代码,但通常调用fflush
应该做到这一点。