【发布时间】:2011-03-11 02:22:03
【问题描述】:
我很少有与多线程环境中的 read()/pread() 系统调用相关的查询
我正在使用基于 freeBsd 的 Mac-OSX,如果有任何帮助的话 我只在读取模式下使用这个文件,而不是读/写 而且语言是c/c++
假设我们在磁盘上有一个文件 AAAABBBBCCCCDDDEEEE....
文件的一页可以容纳 4 个字母
所以第1页:AAAA
第2页:BBBB .....等等
现在我从具有相同文件描述符的两个不同线程启动读取系统调用 我的意图是从线程 1 读取第一页,从线程 2 读取第二页,..等等。
读取(fd,buff,sizeof(page));
从手册页中我了解到 read 也会增加文件指针,所以我肯定会得到像这样的乱码响应
ABCC ABBB ..等(无特定顺序)
为了解决这个问题,我可以使用 pread()
"Pread() 执行相同的功能,但从特定的 在文件中指定位置而不修改文件指针”//来自手册页
但我不确定使用 pread 是否真的能帮助我实现目标,因为即使它不会增加内部文件指针,也不能保证响应不会混乱。
我所有的数据都是页面对齐的,我想从每个线程中读取一页
线程 1 读取:AAAA 线程2读取:BBBB 线程 3 读取:CCCC ... 没有真正乱码内容..
我还发现了一个帖子Is it safe to read() from a file as soon as write() returns?
但它不是很有用。
我也不确定 read() 是否真的会出现我正在考虑的问题。我正在读取的文件是二进制文件,因此我很难快速手动读取和验证..
任何帮助将不胜感激
【问题讨论】:
标签: c multithreading asynchronous thread-safety