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...
Пока на собственное сообщение не было ответов, его можно удалить.