Есть ли какое-либо преимущество в использовании файла, пишущего с перекрытым IO в Windows, по сравнению с тем, чтобы просто делать записи файла в отдельном потоке, который я создаю?
[Редактирование - обратите внимание на то, что я делаю записи файла без системного кэширования, т.е. я использую флаг FILE_FLAG_NO_BUFFERING в CreateFile),
Поскольку по умолчанию все операции записи кэшируются в системном кэше, выполнение операций ввода-вывода с перекрытием или создание отдельного потока для записи вообще не дает особых преимуществ. Большинство вызовов WriteFile - это просто memcpys по своей сути, которые ОС лениво записывает на диск оптимальным образом с другими операциями записи.
Вы, конечно, можете отключить буферизованный ввод-вывод с помощью флагов в CreateFile, и тогда есть преимущества в выполнении некоторого вида асинхронного ввода-вывода, но вы, вероятно, не делали / не должны этого делать.
Править
ОП пояснил, что они на самом деле используют небуферизованный ввод-вывод. В этом случае два предложенных решения почти идентичны; внутри Windows использует пул потоков для обслуживания асинхронных запросов ввода-вывода. Но гипотетически Windows может быть более эффективной, поскольку ее половина реализована в ядре, имеет меньше переключателей контекста и т. Д.
Возможно из-за того, что перекрывающийся ввод-вывод в окнах заставит Windows записать файл в свое время в фоновом режиме, в отличие от создания целого нового потока и выполнения операции блокировки?
Одним из преимуществ перекрывающегося ввода-вывода является то, что он позволяет одному потоку (или, чаще всего, пулу потоков) обрабатывать произвольное количество запросов ввода-вывода одновременно. Это может не быть преимуществом для однопользовательского настольного приложения, но для серверного приложения, которое может получать запросы ввода-вывода от множества разных клиентов, это может быть большой победой.