1 Star 0 Fork 0

wikall / sylar-clone

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

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

  • 添加eventloop的退出机制。使用 eventfd 进行通知。要注意一点:on_wakeup 是 eventloop 的成员函数,因此回调的时候不要在注册的线程池中运行。否则会导致 segment fault 。
  • 在eventloop中,由于所有的对象都使用的是RAII模式进行生命周期管理,当timer_manager和eventFd对象析构的时候会关闭对应的文件描述法,之后再去析构epollwrap的时候,将导致移除timerfd和eventfd的已经非法的文件描述。解决办法:
    • 将 timer_manager 、 eventFd、epollWrap对象按照特定顺序排列,让eventloop对象析构的时候保证先析构epollwrap对象。暂时使用该方法,方法二,还没想好该如何进行绑定
    • 或者使用std::shared_ptr管理 timer_manager 和 eventFd,当注册timerfd和eventfd到epoll的时候,把他们的智能指针绑定到对应的event上
  • 为main thread 创建 Pthead 对象无法正常析构,或者是说,在LOG宏中使用 fisher::Pthread::Get_This()时会导致使用 main thread 创建一个 Pthread 对象,这个对象是一个thread_local 线程,但是无法正常析构。
  • threadpoll 的线程实现换成pthread后无法正常退出程序,segment fault,在 wsl 上无法产生 core 文件!!
    • 线程状态设置不正确,启动后没有将线程状态设置为running,导致线程退出时没有进行join。
  • 定时器与epoll:timerfd要在reset前进行read!!定时器存在重复回调的问题??timer重新调度的时候需要进行reset更新expire_clock.
  • 使用 lambda 表达式捕获 share_ptr,延长智能指针的生命周期,防止 eventloop 在外部被停止之后任务仍然在另外的线程池中运行导致的内存非法问题
  • [/mnt/data/fxwork/sylar-clone/src/base/epoll.cc][line=24][~epollWrap]-->::epoll_ctl error:Bad file descriptor
    • eventloop 中timer_manager 、 eventFd、epollWrap对象析构顺序的衍生问题
  • [/mnt/data/fxwork/sylar-clone/src/base/pthread.cc][line=58][~Pthread]-->thread id:139706236917504,thread name:UNKNOWN
    • 创建线程的时候未指定线程名称
  • undefined fisher::Pthread::sleep_for in eventloop_test line 13
    • 先在头文件中定义,奇奇怪怪的问题~~~

说明

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学习后的结合自己的所掌握的知识与理解所写。代码尽量遵循以下几个原则:

    1. 尽量使用C++11,尽量使用C++,避免非线程安全函数,避免系统相关函数的调用
    1. 避免继承和多态,尽量用 std::function 。 使用基于对象,而不是面向对象的编程思想。
    1. 代码层次清晰,简单易读,避免复杂的模板、继承、相互引用嵌套等等
    1. 尽量少的向外暴露接口、类

原项目作者为 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二级指针???

空文件

简介

sylar-clone 该项目为开源项目sylar学习后的复现,但是代码结构并不保证和原代码一致。 原项目作者为 sylar-yin,具体内容请访问: - [sylar在github的地址](https://github.com/sylar-yin/sylar) - [sylar独立网站](www.sylar.to) 展开 收起
C++ 等 4 种语言
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C++
1
https://gitee.com/wikall/sylar-clone.git
git@gitee.com:wikall/sylar-clone.git
wikall
sylar-clone
sylar-clone
master

搜索帮助