Потоковое ведение журнала внутри общей библиотеки C ++ - PullRequest
1 голос
/ 09 февраля 2010

Я реализовал многопоточную разделяемую библиотеку в C ++ (для Linux и Windows). Я хотел бы добавить механизм регистрации внутри самой библиотеки. Вызывающий библиотеку не знает об этом. Файл журнала был бы таким же, поэтому мне интересно, как я могу спроектировать потокобезопасное ведение журнала, если несколько библиотек используют мою библиотеку и пытаются открыть и войти в один и тот же файл журнала. Есть предложения?

Ответы [ 3 ]

2 голосов
/ 09 февраля 2010

Вы можете попробовать использовать библиотеку log4cpp .

1 голос
/ 09 февраля 2010

Использовать блокировку файлов. Я считаю, что fcntl совместим с POSIX, поэтому должен работать и на Windows. Использует ли ваш код вызовы Posix?

С помощью fcntl вы сможете блокировать определенный диапазон байтов. Так что, если вы хотите завершить работу и попытаться заблокировать количество байтов, которые вы собираетесь записать, это должно быть довольно быстро. Чтобы получить блокировку, вы, вероятно, можете вращаться, отказываясь от процессора на некоторое время, если вы не получаете блокировку.

1 голос
/ 09 февраля 2010

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

В противном случае у вас есть два варианта:

  1. Используйте мьютекс. Самое простое решение.
  2. Иметь поток ведения журнала с беспрепятственной блокировкой (вы, вероятно, сможете использовать мьютекс), очередь сообщений FIFO, которая создается / уничтожается при создании / уничтожении вашей библиотеки. Я надеюсь, у вас есть функция init / deinit ...

Разница между ч / б 1 и 2 заключается в том, что для 1 вы удерживаете мьютекс для полной операции ввода-вывода. Во втором случае вы удерживаете мьютекс только столько времени, сколько нужно, чтобы отправить сообщение в конец очереди, что может быть постоянной операцией, если вы все сделаете правильно.

...