Независимая регистрация в многопоточных приложениях - PullRequest
0 голосов
/ 21 января 2019

В настоящее время я отлаживаю многопоточное приложение (pthread под Linux ia64, ARM). valgrind, helgrind и gdb - мои используемые в настоящее время инструменты.

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

Наивная реализация будет делать некоторые записи / fprintf, которые могут (в зависимости от реализации libc) блокирует некоторый внутренний мьютекс. Это, в свою очередь, повлияет на поведение программы (Я бы назвал это «запиранием случайно») и, следовательно, не приемлемо.

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

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

Я думаю, что это общая проблема для многих разработчиков и Интересно, есть ли лучший подход. Есть предложения?

1 Ответ

0 голосов
/ 21 января 2019

Современные многопоточные безопасные высокопроизводительные регистраторы обычно:

  • Предоставьте отдельный буфер журналирования для каждого потока, чтобы не было блокировки, когда поток записывает сообщение журнала в буфер (буфер ожидания одного производителя-одного пользователя).
  • Сообщения журнала являются двоичными, нет snprintf или любое другое форматирование происходит в потоке, который отправляет сообщение журнала. Например. сообщение журнала является копией строки формата и аргументов (строку формата можно скопировать мелко).
  • Иметь отдельный поток ввода / вывода, который считывает двоичные сообщения журнала из других потоков, форматирует их и записывает в файл (ы) журнала.
  • Поток ввода / вывода периодически опрашивает буферы журналирования, поэтому при отправке сообщения журнала межпотоковый обмен сообщениями не требуется. С возможностью для производителя сообщений уведомить поток ввода-вывода о немедленной записи сообщений журнала в файл журнала (например, свободное место в буфере журналирования уменьшается).
...