Я ищу способ сделать асинхронный и ориентированный на многопотоковое исполнение вход в систему моего проекта C++, если это возможно, в один файл. Я в настоящее время использую cerr
и clog
для задачи, но так как они синхронны, выполнение вскоре приостанавливается каждый раз, когда что-то зарегистрировано. Это - относительно графически-тяжелое приложение, таким образом, такого рода вещь является довольно раздражающей.
Новый регистратор должен использовать асинхронный ввод-вывод для избавлений от этих пауз. Потокобезопасность также была бы желательна, поскольку я намереваюсь добавить некоторую основную многопоточность скоро.
Я рассмотрел подход one-file-per-thread, но это казалось, что он сделает управление журналами кошмаром. Какие-либо предложения?
Рассматривали ли вы возможность использования библиотеки журналов.
Есть несколько доступных, я недавно обнаружил Pantheios , и это действительно кажется невероятным.
Это скорее интерфейсный регистратор, вы можете настроить используемую систему. Например, он может взаимодействовать с ACE
или log4cxx
и кажется действительно простым в использовании и настройке. Основное преимущество в том, что он использует типизированные операторы, что всегда здорово.
Если вам просто нужна библиотека журналов barebone:
Выберите любой :)
Я должен отметить, что в C ++ и что они отлично подходят для ведения журнала.
Я думаю, что правильный подход - не один файл на поток, а один поток на файл. Если к любому файлу (или ресурсу в целом) в вашей системе будет обращаться только один поток, программирование, безопасное для потоков, станет намного проще.
Так почему бы не сделать Logger выделенным потоком (или несколькими потоками, по одному на файл, если вы записываете разные вещи в разные файлы), а во всех остальных потоках запись в журнал помещала бы сообщение в очередь ввода в соответствующем потоке Logger, который получал бы его после записи предыдущего сообщения. Все, что для этого нужно, это мьютекс для защиты очереди от добавления события, пока Logger читает событие, и condvar для Logger для ожидания, когда его очередь пуста.
Это ОЧЕНЬ возможно и практично. Откуда мне знать? Именно это я написал на последней работе. К сожалению (для нас), теперь они владеют кодом. :-) К сожалению, они даже не используют его.
Я намереваюсь написать версию с открытым исходным кодом в ближайшем будущем. А пока я могу дать вам несколько советов.
Это внутренне совместимо с потоками, поскольку вы используете очередь. Тем не менее, вы все равно захотите установить некоторую защиту, похожую на мьютекс, вокруг записи в очередь, чтобы данный журнал << "материал" << "больше материала"; Операция типа остается построчно-атомарной.
Удачи!