我需要为来自网络套接字的大量数据实现一个简单的“溢出到磁盘”层。我希望有两个 CFILE*
流,一个由写入文件的后台线程使用,一个由读取它的前端线程使用。
这两个流是这样一个线程可以在一个偏移量处写入,而另一个在其他地方读取 - 无需锁定并阻塞另一个线程。
将有一个分页机制,因此读/写是在随机访问位置 - 不一定是顺序的。
还有一点需要注意的是,这需要在 Windows 和 Linux 上运行。
问题:在第一个流的 fwrite 返回后,写入的数据是否保证对第二个流上的 fread 立即可见?
如果没有,我还可以考虑哪些其他选择?
所以 Posix 的 pread/pwrite 函数结果是我需要的。这是 Win32 的版本:
size_t pread64(int fd, void* buf, size_t nbytes, __int64 offset)
{
OVERLAPPED ovl;
memset(&ovl, 0, sizeof(ovl));
*((__int64*)&ovl.Offset)=offset;
DWORD nBytesRead;
if (!ReadFile((HANDLE)_get_osfhandle(fd), buf, nbytes, &nBytesRead, &ovl))
return -1;
return nBytesRead;
}
size_t pwrite64(int fd, void* buf, size_t nbytes, __int64 offset)
{
OVERLAPPED ovl;
memset(&ovl, 0, sizeof(ovl));
*((__int64*)&ovl.Offset)=offset;
DWORD nBytesWritten;
if (!WriteFile((HANDLE)_get_osfhandle(fd), buf, nbytes, &nBytesWritten, &ovl))
return -1;
return nBytesWritten;
}
(感谢大家对此的投入 - 非常感谢)。