我应该实现自己的日志记录类,以便在具有两个线程的程序中使用,主线程和可连接的处理线程。我不希望任何一个线程在另一个线程使用记录器时使用它,所以我想我会使用 wxMutex。记录器必须像带有 operator<< 的 C++ ostream 一样工作,除了流操纵器函数(例如 std::endl)将指示记录器输出的结束。我想我需要一个递归互斥锁,以便在互斥锁被锁定时同一个线程可以继续输出。
问题(我认为)是互斥锁没有完全解锁,所以当另一个线程试图输出到记录器时,它会死锁。
我的代码中是否有我遗漏的东西?
class Logger{
private:
std::ostream* out;
wxMutex* mut;
....
public:
template<class T>
Logger& operator<<(T str){ // accept any type of input and lock outputting until finished
if(out){
if(mut->TryLock() == wxMUTEX_BUSY){ // if we didn't get lock
mut->Lock(); // we block
}
if(out){
(*out) << str;
out->flush();
}
//mut->Unlock(); // leave locked until done outputting (use std::endl or similar)
}
return *this;
}
// accept stream manipulators and unlock stream output
Logger& operator<<(std::ostream& (*pf) (std::ostream&)){
if(out){
if(mut->TryLock() == wxMUTEX_BUSY){
mut->Lock();
}
(*out) << pf;
out->flush();
while(mut->Unlock()!= wxMUTEX_UNLOCKED);
}
return *this;
}
};