编码规范
https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/
禁止拷贝基类
为什么禁用拷贝(复制)构造函数
浅拷贝问题
默认生成的拷贝构造函数会直接拷贝成员指针的地址,这样两个对象的指针指向同一个缓冲区,导致析构的时候两次删除同一片区域的问题(这个问题又叫
双杀
问题)解决办法:
基类拷贝问题
如果我们不去自己编写拷贝构造函数,编译器默认生成的版本会自动调用基类的拷贝构造 函数完成基类的拷贝,但是如果我们出于某种原因编写了,自己编写了拷贝构造函数(比如因为上文中提到的浅 拷贝问题),编译器不会帮我们安插基类的拷贝构造函数,它只会在必要的时候帮我们安 插基类的默认构造函数
1 | //禁止拷贝基类 |
StrPrinter 辅助类
字符串拼接输出
1 | string output = StrPrinter << "a" << "b" << "c" << "d" << endl; |
1 |
|
Logger 辅助类
LogContextCapturer
- 传入Logger对象,用于实现log输出方式
- 实现 操作符<<,用于输出log
1 | /** |
LogContext
- 继承于ostringstream
- 保存log的基本信息
1 | /** |
Logger
- 可以追加多个Channel
- 统一调整每个Channel的等级
- 可以设置writer,如果设置writer,则用writer输出各个Channel,如果没设置,则用默认channel输出
1 | /** |
LogChannel
- Channel的基类,子类要重写write,需要调用format格式化输出log
1 | class LogChannel : public noncopyable { |
ConsoleChannel
1 | void ConsoleChannel::write(const Logger &logger, const LogContextPtr &logContext) { |
FileChannel
1 | void FileChannel::write(const Logger &logger, const LogContextPtr &logContext) { |
SysLogChannel
Linux C中提供一套系统日记写入接口,包括三个函数:openlog,syslog和closelog。调用openlog是可选择的。如果不调用openlog,则在第一次调用syslog时,自动调用openlog。调用closelog也是可选择的,它只是关闭被用于与syslog守护进程通信的描述符。
其中openlog和closelog都是可选的。不过,通过调用openlog,我们可以指定ident参数。这样,ident将被加到每条日记记录中。
1 |
|
1 | void SysLogChannel::write(const Logger &logger, const LogContextPtr &logContext) { |
AsyncLogWriter
1 | AsyncLogWriter::AsyncLogWriter(Logger &logger) : m_exit_flag(false),m_logger(logger) { |
ResourcePool循环池辅助类
限制资源的总数,防止资源过多,每次析构时,会根据池中的数量,决定是放回池中,还是删除。
测试程序
1 |
|
shared_ptr_imp
- 析构时,自动放回池或者删除
1 | template<typename C> |
ResourcePool
- 设置pool大小
- 获取元素
1 | template<typename C> |
ResourcePool_l
- 实现创建对象
- 获取对象
- 回收对象,池满删除
1 | template<typename C> |
ThreadPool线程池辅助类
ThreadPool = ThreadGroup+TaskQueue
- ThreadPool 设置线程个数,
- 设置线程池的优先级
- 设置线程池是自动运行和手动运行
- 插入线程池的最开始
- 调整单个线程的优先级
- 支持同步执行
1 | class ThreadPool: public TaskExecutor |
TaskExecutor
- 纯虚函数async
ThreadGroup (创建就运行)
- 可以判断当前线程是否属于线程池
- 添加线程create_thread 返回线程指针
- 移除线程remove_thread
1 | class ThreadGroup { |
TaskQueue
1 | template<typename T> |