асинхронная операция
От: Аноним  
Дата: 05.08.10 08:59
Оценка:
Добрый день.

Имеется приложение:
1. порождающее множество потоков.
2. имеется поток объекта класса логирования.
3. Каждый поток "кидает" сообщения в поток логирования синхронными операциями.

Со временем приложение начало оперировать большим количеством девайсов.И если выбрать максимальный уровень логирования то основательно тормозит. Каким образом можно уйти от синхронных операций? Трудность заключается что приложение основательно использует BOOST и не хотелось бы уходить от данной концепции.

Вариант с:


boost::thread some_thread(&SomeFunction, param1, param2);


как то не очень нравится...да и видимо будет вреден в данной ситуации.
Re: асинхронная операция
От: Sni4ok  
Дата: 05.08.10 09:16
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Имеется приложение:

А>1. порождающее множество потоков.
А>2. имеется поток объекта класса логирования.
А>3. Каждый поток "кидает" сообщения в поток логирования синхронными операциями.

А>Со временем приложение начало оперировать большим количеством девайсов.И если выбрать максимальный уровень логирования то основательно тормозит. Каким образом можно уйти от синхронных операций?


генерируйте логируемое сообщение в буфере, а буфер вместе с его владением отдавайте логеру, который в отдельной нитке всё это логирует.
Re[2]: асинхронная операция
От: Аноним  
Дата: 05.08.10 11:19
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


А>>Имеется приложение:

А>>1. порождающее множество потоков.
А>>2. имеется поток объекта класса логирования.
А>>3. Каждый поток "кидает" сообщения в поток логирования синхронными операциями.

А>>Со временем приложение начало оперировать большим количеством девайсов.И если выбрать максимальный уровень логирования то основательно тормозит. Каким образом можно уйти от синхронных операций?


S>генерируйте логируемое сообщение в буфере, а буфер вместе с его владением отдавайте логеру, который в отдельной нитке всё это логирует.


Так примерно и сделано,сообщения в вектор валятся, но мьютексы я так понял основательно тормозят работу остальных потоков в целом
Re: асинхронная операция
От: Mazay Россия  
Дата: 05.08.10 11:25
Оценка:
Здравствуйте, Аноним, Вы писали:

Я бы использовал конкурентную очередь из Intel TBB. Она вроде как неблокирующаяся.
Главное гармония ...
Re[2]: асинхронная операция
От: Аноним  
Дата: 05.08.10 11:40
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Здравствуйте, Аноним, Вы писали:


M>Я бы использовал конкурентную очередь из Intel TBB. Она вроде как неблокирующаяся.


Нужно BOOST решение как максимум. Слышал о boost.task но то ли это?
Re[3]: асинхронная операция
От: Мишень-сан  
Дата: 05.08.10 12:20
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Mazay, Вы писали:


M>>Здравствуйте, Аноним, Вы писали:


M>>Я бы использовал конкурентную очередь из Intel TBB. Она вроде как неблокирующаяся.


А>Нужно BOOST решение как максимум. Слышал о boost.task но то ли это?


Неблокирующая очередь
Автор: remark
Дата: 10.03.10
за авторством Remark
Пользую для собственного логгера. Генерю сообщение в хост-потоке, отдаю через аналог shared_ptr и неблокирующую очередь потоку логгера, в котором пишу в лог и удаляю.
Re[3]: асинхронная операция
От: Mazay Россия  
Дата: 05.08.10 14:23
Оценка:
Здравствуйте, Аноним, Вы писали:

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 нельзя?
Главное гармония ...
Re[3]: асинхронная операция
От: Sni4ok  
Дата: 05.08.10 15:23
Оценка:
Здравствуйте, Аноним, Вы писали:

S>>генерируйте логируемое сообщение в буфере, а буфер вместе с его владением отдавайте логеру, который в отдельной нитке всё это логирует.


А>Так примерно и сделано,сообщения в вектор валятся, но мьютексы я так понял основательно тормозят работу остальных потоков в целом


значит где-то долго лочите, например копируете по значению, или пока логируете блокируете мутекс и т.п, в псевдокоде вида:

list<char*> bufs;
boost::mutex mutex;
boost::condition condition;

void add(char* message){
  boost::mutex::scoped_lock l(mutex);
  bufs.push_back(message);
  condition.notify();
}
void log_thread(){
  std::list<char*> my_bufs;
  boost::mutex::scoped_lock l(mutex);
  for(;;){
    if(!bufs.empty()){
      my_bufs.swap(bufs);
      l.unlock();
      {
        //запись в лог всего my_bufs, возврат буферов из my_bufs, очистка my_bufs
      }
      l.lock();
      continue;
    }
    condition.wait(l);
  }
}


тормозить просто негде, хоть там тысяча ниток к логеру одновременно обращаться будет будет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.