池化技术
池化技术可以减少底层重复工作,例如创建进程、线程、申请内存空间时的系统调用和初始化工作。线程池是执行流级别的池化技术,STL 中的空间配置器和内存池是内存块管理级别的池化技术。
线程池的日志模块
结合线程池封装进行设计,需要完成以下准备:
- 准备线程的封装
- 准备锁和条件变量的封装
- 引入日志,对线程进行封装
日志与策略模式
计算机中的日志是记录系统和软件运行中发生事件的文件,主要作用是监控运行状态、记录异常信息,帮助快速定位问题并支持程序员进行问题修复。它是系统维护、故障排查和安全管理的重要工具。
日志格式必须包含以下指标:
- 时间戳
- 日志等级(严重程度)
- 日志内容
可选指标包括:
- 文件名行号
- 进程、线程相关 ID 信息等
现成的解决方案有 spdlog、glog、Boost.Log、Log4cxx 等,此处采用自定义日志方式。这里采用设计模式中的策略模式来进行日志的设计。
期望的日志格式如下: [图片:日志输出格式示意图]
日志模块
两个核心问题
- 日志内容的刷新策略,刷新到显示器或文件或网络。
- 构建一条完整的日志。
设计文件等级
枚举类型中的枚举值底层存储是整数,需要转换成字符串输出。
// Logger.hpp
// C++11 支持的强枚举,访问成员需指定作用域,不易出现命名冲突
enum class LogLevel {
DEBUG,
INFO, // 正常消息
WARNING, // 出现错误,但不影响程序运行
ERROR, // 导致程序退出的错误
FATAL // 重大错误
};
std::string Level_to_string(LogLevel level) {
switch (level) {
case LogLevel::DEBUG: return "DEBUG";
case LogLevel::INFO: return "INFO";
case LogLevel::WARNING: return "WARNING";
case LogLevel::ERROR: return "ERROR";
case LogLevel::FATAL: return "FATAL";
: ;
}
}


