Имеется приложение:
1. порождающее множество потоков.
2. имеется поток объекта класса логирования.
3. Каждый поток "кидает" сообщения в поток логирования синхронными операциями.
Со временем приложение начало оперировать большим количеством девайсов.И если выбрать максимальный уровень логирования то основательно тормозит. Каким образом можно уйти от синхронных операций? Трудность заключается что приложение основательно использует BOOST и не хотелось бы уходить от данной концепции.
Здравствуйте, Аноним, Вы писали:
А>Имеется приложение: А>1. порождающее множество потоков. А>2. имеется поток объекта класса логирования. А>3. Каждый поток "кидает" сообщения в поток логирования синхронными операциями.
А>Со временем приложение начало оперировать большим количеством девайсов.И если выбрать максимальный уровень логирования то основательно тормозит. Каким образом можно уйти от синхронных операций?
генерируйте логируемое сообщение в буфере, а буфер вместе с его владением отдавайте логеру, который в отдельной нитке всё это логирует.
Re[2]: асинхронная операция
От:
Аноним
Дата:
05.08.10 11:19
Оценка:
Здравствуйте, Sni4ok, Вы писали:
S>Здравствуйте, Аноним, Вы писали:
А>>Имеется приложение: А>>1. порождающее множество потоков. А>>2. имеется поток объекта класса логирования. А>>3. Каждый поток "кидает" сообщения в поток логирования синхронными операциями.
А>>Со временем приложение начало оперировать большим количеством девайсов.И если выбрать максимальный уровень логирования то основательно тормозит. Каким образом можно уйти от синхронных операций?
S>генерируйте логируемое сообщение в буфере, а буфер вместе с его владением отдавайте логеру, который в отдельной нитке всё это логирует.
Так примерно и сделано,сообщения в вектор валятся, но мьютексы я так понял основательно тормозят работу остальных потоков в целом
Я бы использовал конкурентную очередь из Intel TBB. Она вроде как неблокирующаяся.
Главное гармония ...
Re[2]: асинхронная операция
От:
Аноним
Дата:
05.08.10 11:40
Оценка:
Здравствуйте, Mazay, Вы писали:
M>Здравствуйте, Аноним, Вы писали:
M>Я бы использовал конкурентную очередь из Intel TBB. Она вроде как неблокирующаяся.
Нужно BOOST решение как максимум. Слышал о boost.task но то ли это?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Mazay, Вы писали:
M>>Здравствуйте, Аноним, Вы писали:
M>>Я бы использовал конкурентную очередь из Intel TBB. Она вроде как неблокирующаяся.
А>Нужно BOOST решение как максимум. Слышал о boost.task но то ли это?
за авторством Remark
Пользую для собственного логгера. Генерю сообщение в хост-потоке, отдаю через аналог shared_ptr и неблокирующую очередь потоку логгера, в котором пишу в лог и удаляю.
Здравствуйте, Аноним, Вы писали:
M>>Я бы использовал конкурентную очередь из Intel TBB. Она вроде как неблокирующаяся.
А>Нужно BOOST решение как максимум. Слышал о boost.task но то ли это?
Ну вот. Наконец-то народ перестал шарахаться от Буста. Теперь шарахаются от TBB. Повторяем те же советы, которые в свое время давали по бустофобам:
1) Посмотри исходник очереди TBB и выдерни код.
2) Найди любую другую реализацию неблокирующейся очереди (поставь оценку remark'у) и выдерни код.
3) Почитай статьи про то, как делаются неблокирующиеся контейнеры (поставь оценку remark'у) и напиши свою реализацию (Let's bike it! Yo!).
Ну и кое-что сверху.
4) Используй Boost.Lockfree из vault'a.
5) Используй Boost.Log из vault'a.
Все эти варианты гораздо более рисковые по сравнению с использованием TBB. А почему TBB нельзя?
Здравствуйте, Аноним, Вы писали:
S>>генерируйте логируемое сообщение в буфере, а буфер вместе с его владением отдавайте логеру, который в отдельной нитке всё это логирует.
А>Так примерно и сделано,сообщения в вектор валятся, но мьютексы я так понял основательно тормозят работу остальных потоков в целом
значит где-то долго лочите, например копируете по значению, или пока логируете блокируете мутекс и т.п, в псевдокоде вида: