Асинхронный ввод-вывод между процессами

Все:

Я пишу решение для ведения журнала. Одной из доступных конечных точек журнала является текстовый файл. Предположим, я хочу писать в этот файл из нескольких процессов: я могу открыть его совместно и использовать именованный мьютекс для управления одновременным доступом к файлу (при условии, что весь доступ происходит на одной машине). Но потом я начал задумываться об асинхронном вводе-выводе. Внутри процесса я мог бы использовать BeginWrite для асинхронного запуска моих операций записи. Как насчет межпроцессных или межмашинных проблем? Безопасен ли асинхронный ввод-вывод в таких ситуациях?

(при условии, что когда я вызываю BeginWrite(), буфер, который я передаю, содержит все, что должно храниться вместе в одной логической «записи»)


person JMarsch    schedule 29.09.2009    source источник


Ответы (2)


Прежде чем выбрать решение для асинхронного ввода-вывода, обратите внимание, что очень часто то, что вы считаете асинхронной записью, в конечном итоге обрабатывается синхронно. Особенно важным для вашего решения для ведения журналов является небольшая заметка, скрытая в асинхронном диске. Ввод-вывод отображается как синхронный в Windows NT, Windows 2000 и Windows XP. Похоронен там в обсуждении этот самородок:

«В Windows NT любая операция записи в файл, увеличивающий его длину, будет синхронной».

Хотя там написано «Windows NT», по моему опыту, это верно и для Windows 2000, Windows XP и Server 2003. Я думаю, что они имели в виду «NTFS», а не «Windows NT». Я не тестировал его на Vista или Server 2008.

Далее в статье предлагаются возможные решения этого ограничения. Я предполагаю, что они работают, но на самом деле не пробовал их.

Самое надежное решение, которое я нашел, — создать поток, выполняющий синхронную запись. Какая-то головная боль, правда, но эффективная.

person Jim Mischel    schedule 29.09.2009

Я не уверен, что вы имеете в виду под ошибкой. Если вы защищаете доступ к файлу с помощью соответствующего межпроцессного мьютекса, то даже при асинхронном вводе-выводе у вас будет только 1 процесс, записывающий файл в данный момент времени. Это предполагает, что вы держите мьютекс заблокированным до завершения асинхронного ввода-вывода.

person JaredPar    schedule 29.09.2009
comment
Насчет мьютекса согласен. Однако, если ввод-вывод произошел с другого компьютера (на общем ресурсе), мьютекс не будет виден другому компьютеру. Это заставило меня задуматься о том, как операционная система обрабатывает перекрывающийся ввод-вывод и есть ли встроенная защита, гарантирующая, что за один раз происходит только одна запись. - person JMarsch; 29.09.2009