c++ - 为日志记录重载 << 运算符的设计的潜在问题

标签 c++ multithreading logging

我想写一个可以像std::cout 一样使用的类使用 <<运算符(operator)。我希望能够在使用一系列 << 的代码段的开头获得互斥锁。运算符并在语句末尾释放该互斥体。

例如:

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;

最佳答案

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

相反,你为什么不想办法在没有锁的情况下准备要记录的信息/字符串(例如,进入函数/范围本地或线程本地对象/字符串),然后记录整个信息/字符串一次,保持同步部分尽可能短。

关于c++ - 为日志记录重载 << 运算符的设计的潜在问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27759402/

相关文章:

java - C++:按值传递对象的原因

c++ - 在 sfml 中管理多个 RenderWindow

objective-c - 如何将所有错误(包括未捕获的异常、NSLog 调用和其他日志)重定向到 Mac OS X 上的日志文件?

debugging - 执行未记录在 Apps 脚本仪表板中的 Stackdriver 日志中

c++ - 从类函数中显示动态 C 字符串的段错误 11

C++ Word Automation 问题将工作簿中的图表或工作表导出到图像

multithreading - TClientSocket和线程

c# - 如何使用 foreach 循环制作多线程应用程序

c++ - 将互斥锁绑定(bind)到对象

logging - 我应该在 Go 中关闭日志文件吗?