Одновременно и асинхронно записывать в файл с MSVC? - PullRequest
3 голосов
/ 22 марта 2012

В настоящее время я использую один поток и fseek / fwrite для сохранения данных в большом файле в цикле. Но, конечно, экономия является узким местом. Чтобы устранить это узкое место, я думаю, что могу создать поток для асинхронной записи в файл, но это заблокирует доступ к файлу в следующей итерационной теме.

Есть ли способ одновременной и асинхронной записи в файл в Visual C / C ++?

(ОС - Windows)

Ответы [ 3 ]

2 голосов
/ 22 марта 2012

Используйте функцию:

CreateFileMapping

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

, чтобы отобразить в памяти выходной файл в память, а затем вы можете одновременно записать несколько потоков в память.*

Подробнее о файлах, отображаемых в память, здесь:

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

1 голос
/ 22 марта 2012

Используйте CreateFile (), SetFilePointer () и SetEndOfFile () для создания и предварительного изменения размера файла. Затем используйте CreateFile () в ваших рабочих потоках, чтобы открыть дополнительные дескрипторы файла, SetFilePointer () для поиска желаемых смещений и WriteFile () для записи в него. Пока каждый вызов CreateFile () предоставляет права FILE_SHARE_WRITE, вы можете одновременно открывать несколько дескрипторов с разрешениями GENERIC_WRITE. Каждый дескриптор поддерживает свой собственный указатель в файле.

1 голос
/ 22 марта 2012

Асинхронные функции ввода-вывода, такие как WriteFileEx , разрешают одновременный доступ. Но мне не ясно, как вы думаете, это улучшит вашу пропускную способность.

...