【发布时间】:2015-01-03 20:51:32
【问题描述】:
我想编写一个可以类似于std::cout 使用<< 运算符的类。我希望能够在使用一系列 << 运算符的代码段的开头获得一个互斥体,并在语句末尾释放该互斥体。
例如:
logger << "Information blah "<< 1;
如果没有锁,在多线程操作中,事情可能会在“Information blah”和 1 之间交错。
这些类的设计是否存在一些重大问题?我知道有大量的日志库,我只是想在一系列 << 运算符的开头维护一个互斥锁并在最后释放互斥锁。
class Logger;
class LockedLogger
{
public:
LockedLogger(Logger & logger):logger_(logger),lock_(new std::lock_guard<std::mutex>(logger.outputMutex_)) {};
template<typename T>
const LockedLogger & operator <<(T t) const{//Logging Code.}
private:
LockedLogger & logger_;
std::shared_ptr<std::lock_guard<std::mutex> > lock_;
};
class Logger
{
public:
Logger();
template<typename T>
LockedLogger operator << (T t){return LockedLogger(*this) << t;}
private:
std::mutex outputMutex_;
friend class LockedLogger;
};
Logger logger;
【问题讨论】:
-
是的。当然,实现记录器可能有更简单的方法。
-
嗯,它有效吗?如果不是,问题是什么?如果是这样,你应该在Code Review。
-
它似乎工作正常(我发现有时看起来工作的东西在某些情况下实际上并不工作方法)。谢谢,我不知道存在代码审查。将在那里发布。
标签: c++ multithreading logging