【发布时间】:2009-04-20 00:19:44
【问题描述】:
我正在用 C++ 编写一个并发的、持久的消息队列,它需要在不使用内存映射 io 的情况下对文件进行并发读取访问。简短的故事是多个线程将需要从文件的不同偏移量中读取。
最初我有一个文件对象,它具有典型的读/写方法,线程将获取一个互斥体来调用这些方法。但是,碰巧我没有在某处正确获取互斥锁,导致一个线程在读/写期间移动文件偏移量,而另一个线程将开始读/写文件的错误部分。
因此,偏执的解决方案是每个线程有一个打开的文件句柄。现在我有很多文件句柄指向同一个文件,我认为这不是很好。
我想使用像pread 这样的东西,它允许将当前偏移量传递给读/写函数。
但是,该功能仅在linux上可用,我需要在windows、aix、solaris和hpux上等效的实现,有什么建议吗?
【问题讨论】:
-
为什么不能为其他平台编写自己的pread()?似乎没有什么是 fseek() 类型函数不能做的。
-
@Duck:Snazzer 想要的是在一个原子操作中寻找和读取的东西。
-
手册页没有表明 pread() 这样做。任何系统都会在常规文件上提供原子查找/读取吗?即使使用 pread() 他也必须在调用它之前提供自己的锁
-
pread 将偏移量作为参数,所以我假设它允许在共享文件句柄上进行原子查找然后读取/写入操作。谷歌搜索似乎表明......或者我错过了什么?否则,如果 pread 不能用于多线程,它似乎没什么用处。
-
@Snazzer:我很抱歉。它是原子的,实际上很酷。我需要多玩一点。
标签: c++ file file-io cross-platform