readme
todo
-
eventloop_test:定时器测试正常,添加loop线程的退出秩序??
-
定时器超时任务处理:如何分辨一个任务是定时器任务,还是超时任务??定时器任务指的是在指定的时间段之后执行的任务。超时任务指的是如果在指定时间之内没有执行的任务则认为该认为超时。该如何进行区分??
-
定时器:将timerfd相关函数移动到timer_manager中?设置为friend即可。
-
timerfd 没必要持有一个timer结构体,只要持有一个时间戳即可。
-
fileutils:remove_file,move_file,is_dir,is_file,file_size,access_time,mkdir_nest,get_files_nest,join_path,stderror,rm_dir_nest,is_empty_dir,
-
字节序转换:网络字节序,主机字节序 https://www.bilibili.com/video/BV184411s7qF?p=50
-
threadpool_test:what(): terminate called after throwing an instance of 'std::bad_weak_ptr' bad_weak_ptr
- defer
- poller
- thread_poller
- socket
- internet_address
- http
- log 增加缓冲区
- endian
FIX ME
说明
update 2021-06-02
- 线程由 std::thread 修改为 pthread ,最初的想法是为每个线程创建一个 thread_local 的变量来管理线程,但是由于无法使用 std::thread 来创建主线程的对象,因此使用 pthread 实现。另外,如果使用 std::thread ,那么还是要借助于 native handle id 来判断是否为主线程。因此在 threadpool 中使用 pthread 替代 std::thread。
- 由于使用 pthread 替换 std::thread ,线程的状态需要自己管理,在 thread_poll 的实现过程中,由于线程的状态错误在线程退出时没有join线程,导致程序不确定性的core dump。错误提示开始是weak_ptr的引用错误,因此将 线程的 thread_local 变量类型修改为 pthread *,而不再使用 std::shared_ptr。最后通过线程状态的调整修复core dump问题。后续需要将 threadlocal thread * 修改为 thread_local shared_ptr。
- 不再对外提供 Pthread::Get_This 接口,而是使用 Get_Thread_Id,Get_Thread_Name,Thread_Info 等静态成员函数。因为 Get_This 在外部使用不安全~
- 个人觉得在 std::thread 在析构时如果线程可以Join但是没有join直接terminal的做法值得参考。但是出于程序健壮性的考虑,在 Pthread 的析构中强制进行了 join 。
- 为 log 在多线程环境中加锁
update 2021-05-30
暂时还不适合单独完成。进度:epoll.h。待实现:
- file utils
- json
- parse args
该项目为开源项目sylar学习后的结合自己的所掌握的知识与理解所写。代码尽量遵循以下几个原则:
-
- 尽量使用C++11,尽量使用C++,避免非线程安全函数,避免系统相关函数的调用
-
- 避免继承和多态,尽量用 std::function 。 使用基于对象,而不是面向对象的编程思想。
-
- 代码层次清晰,简单易读,避免复杂的模板、继承、相互引用嵌套等等
-
- 尽量少的向外暴露接口、类
原项目作者为 sylar-yin,具体内容请访问:
环境
- 系统:wsl+ubuntu18
- 编译器:g++
- 编译选项: -std=c11
差异
日志
- 原始logger一个logger对应n个appender,修改为1对1
- 原始appender持有formmater,修改为由logger持有,appender只管写数据,格式化的逻辑在logger中调用
- 将formmater独立到日志模块外——base/formatter.h
原始项目中一个logger持有n个appender,每条日志会输出到所有的appender代表的流。原作者的意思应该是让程序在运行过程中同一条日志同时输出到不同的流中。但个人用起来感觉稍微别扭,因为自己无法选择输出到哪个流中(除非自己定义appender)。因此,在此借鉴plog的实现,同一条日志只输出到一个appender中,可以通过选择不同的appender将日志输出到不同的地方。2021-01-23
修复日志输出累计问题 2021-02-21
上个版本将format放在logger对象中导致输入流被缓存,将format移动到event对象中。
线程
更改线程实现,上个版本使用std::thread对象作为底层实现,改为pthread库作为底层实现。
trace 信息
backtrace_symbols 为二级指针分配内存??可以直接free二级指针???