我想编写一个类似于std::cout
使用<<
运算符的类。我希望能够在使用一系列<<
运算符的代码段的开头获得一个互斥锁,并在语句结束时释放该互斥锁。
例如:
logger << "Information blah "<< 1;
没有锁定,在多线程操作中,“信息等待”和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;
答案 0 :(得分:2)
如果您选择使用锁定记录器,那么当一个线程正在记录并且可能准备要记录的信息/字符串时,您将停止其他线程。
相反,为什么你没有找到一种方法来准备没有锁定的记录信息/字符串(例如,进入函数/作用域本地或线程本地对象/字符串)然后记录整个信息/ string,保持同步部分尽可能短。