Здравствуйте, Аноним, Вы писали:
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);
}
}
тормозить просто негде, хоть там тысяча ниток к логеру одновременно обращаться будет будет.