Потоковая запись в файле журнала - PullRequest
1 голос
/ 24 июля 2011

Я настраиваю систему регистрации для моего (2d) игрового движка, и она должна иметь возможность записывать строки в файл.

Дело в том, что запись на диск не мгновенная. Если запись в файл (в основном file.flush ()) выполняется в потоке, который вызывает Trace.Write (), будет ли он зависать во время записи файла?

Если это так, то было бы интересно создать поток, используемый только для записи строк журнала в файл журнала, в то время как поток обработки продолжит свою работу.

Тот же вопрос с консолью (пока я здесь ...).

Вопрос:

"Интересно ли в программе с интенсивными вычислениями создавать потоки для консоли и / или записи в файл?"

Спасибо.

Ответы [ 3 ]

2 голосов
/ 24 июля 2011

Да, ваш поток может быть приостановлен, пока он находится в состоянии IOWAIT. Это классическая ситуация приостановки.

Если это хорошая идея, создать поток, отвечающий только за запись записей в лог-файл, зависит от вашего кода. Это связано с I / O? Тогда это может быть хорошей идеей. Ваш код привязан к процессору? Тогда это не сильно поможет. Разве это не так? Тогда это не имеет значения.

Лучший способ понять это - проанализировать ваш код и сравнить две версии.

1 голос
/ 24 июля 2011

Если запись файла (в основном, file.flush ()) выполняется в потоке, который вызывает Trace.Write (), будет ли он зависать во время записи файла?

Да. Это связано с тем, что вызов flush () предназначен для обеспечения попадания данных на диск.

Если это так, то было бы интересно создать поток, используемый только для записи строк журнала в файл журнала, в то время как поток обработки продолжит свою работу.

Почему бы просто не перестать вызывать flush ()? Если вы не заинтересованы в том, чтобы быть абсолютно уверенными в том, что для определенной части программы все записанные на данный момент данные находятся на диске, просто прекратите вызывать flush () вручную, и он будет буферизован и записан в обычный эффективный способ.

В конечном счете, может быть небольшое преимущество записи журнала в другом потоке, если система записи на диск требует периодических синхронизаций, которые приводят к зависанию потока (что, я не уверен, так), но я ожидаю, что вы потеряете гораздо больше, чем вы получаете от реализации синхронизации, однако вы передаете свои журналируемые строки фоновому потоку. Затем вы начинаете задаваться вопросом, можете ли вы использовать очередь без блокировки или какую-либо другую сложную систему, когда действительно вам, вероятно, просто нужно было сделать это простым способом, во-первых - писать когда угодно, очищать только тогда, когда это абсолютно необходимо.

1 голос
/ 24 июля 2011

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

Интересно ли в программе с интенсивными вычислениями создавать потоки консоли и / илизапись в файл?

В общем, учитывая оговорку выше, вероятно, да:

См. также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...