使日志记录运算符过载<<设计的潜在问题
Potential problems with a design that overloads << operator for 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;
如果您选择使用锁定的记录器,那么当一个线程正在记录并可能准备要记录的信息/字符串时,您将停止其他线程。
相反,你为什么不想办法在没有锁的情况下准备要记录的信息/字符串(例如,进入函数/范围本地或线程本地对象/字符串),然后一次记录整个信息/字符串,保持同步部分尽可能短。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 呼叫运营商<<临时
- 基于boost的程序的静态链接——zlib问题