2012-03-22 53 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,允許併發訪問。但是我不清楚你認爲這會提高你的吞吐量。