【发布时间】:2019-08-08 04:30:11
【问题描述】:
我想写一个带有cout 接口的基本线程安全记录器。我想出了以下课程设计。这绝对不是最好的设计,因为如果使用不当,它可能会陷入死锁,如int main() 所示。
#include <iostream>
#include <sstream> // for string streams
#include <mutex>
#include <memory>
typedef std::ostream&(*endl)(std::ostream&);
class BasicLogger {
public:
enum SEVERITY {
CRITICAL,
ERROR,
WARNING
};
explicit BasicLogger(SEVERITY _s): s(_s) {
streamMutex.lock();
logStream.reset(new std::ostringstream);
}
~BasicLogger() {
std::cout << logStream->str();
streamMutex.unlock();
}
std::ostringstream& operator<< (const endl eof) {
(*logStream) << eof;
return (*logStream);
}
template<typename T>
std::ostringstream& operator<< (const T& obj) {
(*logStream) << obj;
return (*logStream);
}
static std::unique_ptr<std::ostringstream> logStream;
BasicLogger(const BasicLogger&) = delete;
BasicLogger& operator=(const BasicLogger&) = delete;
private:
SEVERITY s; //TODO
static std::mutex streamMutex;
};
/*=======================================================*/
std::unique_ptr<std::ostringstream> BasicLogger::logStream;
std::mutex BasicLogger::streamMutex;
/*=======================================================*/
int main() {
int a = 9;
int b = 8;
// BasicLogger l(BasicLogger::ERROR); //Deadlock situation
BasicLogger(BasicLogger::ERROR) << "Linux" << " " << a << " " << b << std::endl;
BasicLogger(BasicLogger::ERROR) << "MyMachine";
BasicLogger(BasicLogger::ERROR) << std::endl;
}
【问题讨论】:
-
最好将日志消息的产生和实际的日志记录与从线程安全的生产者/消费者队列馈送的后台线程解耦。
-
@πάνταῥεῖ 实际上很有趣。我一定会玩弄它的。谢谢。
标签: c++ multithreading c++11 logging