2012-03-22 51 views
3

目前我正在使用单线程和fseek/fwrite将数据保存到循环中的大文件中。但当然,储蓄是瓶颈。为了消除这个瓶颈,我想我可以创建一个用于异步文件写入的线程,但是这会在下一个迭代线程中阻止文件访问。并发和异步地写入MSVC文件?

有没有什么办法可以在Visual C/C++中同时并且异步地写入文件?

(操作系统是Windows)

+0

看起来你想要一个或另一个,但不一定是两者。 – 2012-03-22 01:21:23

回答

1

使用CreateFile(),SetFilePointer()和SetEndOfFile()来创建和预先设置文件的大小。然后在工作线程中使用CreateFile()来打开文件的其他句柄,SetFilePointer()寻找所需的偏移量,WriteFile()写入它。只要每次调用CreateFile()都授予FILE_SHARE_WRITE权限,您就可以一次打开多个具有GENERIC_WRITE权限的句柄。每个句柄在文件中维护自己的指针。

+0

跳过'SetFilePointer'并在'OVERLAPPED'结构中使用'Offset'和'OffsetHigh'字段。 – 2012-03-22 04:15:23

+0

我正要尝试WriteFileEx,但这个解决方案听起来很整齐。我会先试试这个。谢谢。 – 2012-03-23 00:31:25

2

使用功能:

CreateFileMapping 

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366537(v=vs.85).aspx

内存映射输出文件到内存中,然后你可以有你的多线程写入到存储器同时。有关此内存映射文件

更多信息:

http://en.wikipedia.org/wiki/Memory-mapped_file

+0

这可能是最快的解决方案。 – 2012-03-22 04:16:13

+0

我想过这个,但它在32位机器上有2GB的限制。感谢您的回答。 – 2012-03-23 00:29:15

+0

@Paul,你可以映射文件的任何部分,然后再取消映射。你不必一次将整个事物映射到记忆中。 – Ben 2012-03-27 21:47:32

1

异步IO功能,如WriteFileEx,允许并发访问。但是我不清楚你认为这会提高你的吞吐量。