На MacOSX, в программе на C ++, какие гарантии я могу получить при вводе файла - PullRequest
3 голосов
/ 12 марта 2010

Я нахожусь на MacOSX. Я пишу многопоточную программу. Один поток делает логирование. Потоки, не ведущие журнал, могут в любой момент завершить работу.

Какие соглашения я должен принять в регистраторе / какие гарантии я могу иметь?

Я бы предпочел решение, в котором, даже если во время части записи произойдет сбой, предыдущие записи по-прежнему будут отправлены на диск, а при чтении журнала я смогу выяснить: «Ах, я написал 100 полных записей, а затем произошел сбой 101 ".

Спасибо!

Ответы [ 2 ]

1 голос
/ 13 марта 2010

Как говорит Дмитрий, есть только несколько вариантов, чтобы убедиться, что вы действительно фиксируете результаты регистрации. Вы действительно должны написать свой собственный? И действительно ли это должно быть в другом потоке? Это может привести к появлению временного окна для сбоя при пропуске журналов, когда вы обычно хотите вести синхронно.

Средство syslog в Unix является стандартным средством для надежной регистрации системных служб. По сути, это решает проблемы такого рода, которые вы описываете (т. Е. Журналы обрабатываются вне процесса, поэтому в случае сбоя ваши журналы сохраняются).

Если ваше приложение предназначено только для Mac OS X, вы должны взглянуть на средство Apple System Log (ASL) . Он обеспечивает более сложный API, чем syslog, и расширенный набор его функций.

1 голос
/ 12 марта 2010

Я программирую на Linux, а не на MacOSX, но, вероятно, там тоже самое.

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

Плохо то, что если один поток завершит работу с ошибками, весь процесс будет уничтожен вместе с буферизованными данными.

Решения (для Linux), о которых я знаю:

  1. Передача данных регистрации через сокет без использования буферизационного потока регистрации (например, syslog ). В этом случае ОС, вероятно, позаботится о данных, записанных в сокет, и даже если ваше приложение завершится сбоем, данные должны быть получены на другом конце и успешно зарегистрированы.

  2. Не используйте поток журналирования, каждый поток может синхронно записывать в файл. В этом случае потери данных журнала после сбоя должны быть очень малы или не уменьшаться. Хотя это медленнее.

Я пока не знаю лучших решений этой проблемы, хотя было бы интересно узнать их.

...