Асинхронный ориентированный на многопотоковое исполнение входящий в систему C++

Я ищу способ сделать асинхронный и ориентированный на многопотоковое исполнение вход в систему моего проекта C++, если это возможно, в один файл. Я в настоящее время использую cerr и clog для задачи, но так как они синхронны, выполнение вскоре приостанавливается каждый раз, когда что-то зарегистрировано. Это - относительно графически-тяжелое приложение, таким образом, такого рода вещь является довольно раздражающей.

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

Я рассмотрел подход one-file-per-thread, но это казалось, что он сделает управление журналами кошмаром. Какие-либо предложения?

17
задан Electro 28 May 2010 в 15:24
поделиться

3 ответа

Рассматривали ли вы возможность использования библиотеки журналов.

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

Это скорее интерфейсный регистратор, вы можете настроить используемую систему. Например, он может взаимодействовать с ACE или log4cxx и кажется действительно простым в использовании и настройке. Основное преимущество в том, что он использует типизированные операторы, что всегда здорово.

Если вам просто нужна библиотека журналов barebone:

  • ACE
  • log4c *
  • Boost.Log

Выберите любой :)

Я должен отметить, что в C ++ и что они отлично подходят для ведения журнала.

1
ответ дан 30 November 2019 в 13:04
поделиться

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

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

1
ответ дан 30 November 2019 в 13:04
поделиться

Это ОЧЕНЬ возможно и практично. Откуда мне знать? Именно это я написал на последней работе. К сожалению (для нас), теперь они владеют кодом. :-) К сожалению, они даже не используют его.

Я намереваюсь написать версию с открытым исходным кодом в ближайшем будущем. А пока я могу дать вам несколько советов.

  1. Манипуляторы ввода-вывода - это на самом деле просто имена функций. Вы можете реализовать их для своего собственного класса ведения журнала, чтобы ваш регистратор был совместим с cout / cin.
  2. Ваши функции-манипуляторы могут токенизировать операции и сохранять их в очереди.
  3. В этой очереди поток может быть заблокирован, ожидая прохождения кусков журнала. Затем он обрабатывает строковые операции и генерирует фактический журнал.

Это внутренне совместимо с потоками, поскольку вы используете очередь. Тем не менее, вы все равно захотите установить некоторую защиту, похожую на мьютекс, вокруг записи в очередь, чтобы данный журнал << "материал" << "больше материала"; Операция типа остается построчно-атомарной.

Удачи!

4
ответ дан 30 November 2019 в 13:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: