设计过载的潜在问题<<记录操作员

时间:2015-01-03 20:51:33

标签: c++ multithreading logging

我想编写一个类似于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;

1 个答案:

答案 0 :(得分:2)

如果您选择使用锁定记录器,那么当一个线程正在记录并且可能准备要记录的信息/字符串时,您将停止其他线程。

相反,为什么你没有找到一种方法来准备没有锁定的记录信息/字符串(例如,进入函数/作用域本地或线程本地对象/字符串)然后记录整个信息/ string,保持同步部分尽可能短。