我应该实现自己的日志记录类,以便在具有两个线程(主线程和可连接处理线程)的程序中使用。我不希望任何一个线程在另一个线程使用记录器时使用它,所以我想我应该使用 wxMutex。记录器必须像带有运算符 << 的 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;
}
};
最佳答案
如果您担心线程问题,您可以创建一个宏来确保在输出之前获取互斥锁并在输出之后释放。
类似于:
#define LOG(logger, output) \
do { logger.lock(); logger << output; logger.unlock(); } while (0)
Logger my_logger;
int some_integer = 5;
LOG(my_logger, "Hello world!" << some_integer << std::endl);
关于c++ - 我应该如何在一个函数中锁定 wxMutex 并在另一个函数中解锁它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12830206/