gpt4 book ai didi

c++ - 单个文件上两个 C FILE* 流的一致性

转载 作者:可可西里 更新时间:2023-11-01 09:49:29 25 4
gpt4 key购买 nike

我需要为来自网络套接字的大量数据实现一个简单的“溢出到磁盘”层。我希望有两个 C FILE* 流,一个由写入文件的后台线程使用,一个由读取文件的前端线程使用。

这两个流是这样的,一个线程可以在一个偏移处写入,而另一个线程可以在其他位置读取 - 无需锁定并阻塞另一个线程。

将有一个分页机制,因此读/写是在随机访问位置 - 不一定是顺序的。

还有一个警告,这需要在 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;
}

(感谢大家对此的投入 - 非常感谢)。

最佳答案

这听起来非常适合内存映射 I/O。它保证连贯、非常快速,并且跟踪多个指针非常简单。

您需要不同的函数来在不同的操作系统上设置内存映射,但实际的 I/O 是完全可移植的(使用指针引用)。

  • linux: 打开, mmap
  • Windows:CreateFileMappingMapViewOfFile

关于c++ - 单个文件上两个 C FILE* 流的一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5254559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com