【动手写协程库】系列笔记是学习sylar的协程库时的记录,参考了从零开始重写sylar C++高性能分布式服务器框架和代码随想录中的文档。文章并不是对所有代码的详细解释,而是为了自己理解一些片段所做的笔记。

TimerManager类中具体定义实现可以在这里查看:Github: src/timer.cpp

通过定时器,我们可以实现给服务器注册定时事件。sylar的定时器采用最小堆设计,所有定时器根据绝对的超时时间点(也就是超时到期的具体时间戳)进行排序,每次取出离当前时间最近的一个超时时间点,计算出超时需要等待的时间,然后等待超时。超时时间到后,获取当前的绝对时间点,然后把最小堆里超时时间点小于这个时间点的定时器都收集起来,执行它们的回调函数。

阅读全文 »

最近的练手项目web-terminal中(也就是一个网页终端,可执行一些命令),在按下键盘后会显示可能匹配的命令列表(假设对应的函数是setHintList),这不仅是按下字母按键会触发,按下删除键、tab键都会触发。那就不得不考虑一个问题,如果我们手速太快,那么setHintList就会频繁触发,但我们只需要响应用户最后一次输入的命令即可,虽然在这个小项目中没啥问题,但是由此可以引出一些对于以后大项目的考虑:如何减小这种多次频繁执行函数带来的性能开销问题?那就是函数防抖~

阅读全文 »

C++ 中,std::enable_shared_from_this类模板和shared_from_this成员函数主要用于在一个类的成员函数中安全地获取指向自身的std::shared_ptr。它们的作用更多是为了确保资源正确管理。

阅读全文 »

【动手写协程库】系列笔记是学习sylar的协程库时的记录,参考了从零开始重写sylar C++高性能分布式服务器框架和代码随想录中的文档。文章并不是对所有代码的详细解释,而是为了自己理解一些片段所做的笔记。

Scheduler类中其他函数的定义可以在这里查看:Github: src/scheduler.cpp

Sylar的协程调度器是一个N-M模型,意味着N个线程可以运行M个协程,协程能够在线程之间进行切换,也可以被绑定到特定的线程上执行。

调度器可以由应用程序中的任何线程创建,但创建它的线程(称为caller线程)可以选择是否参与协程的调度。如果caller线程参与调度,那么调度器的线程数会相应减少一个,因为caller线程本身也会作为一个调度线程。

阅读全文 »

【动手写协程库】系列笔记是学习sylar的协程库时的记录,参考了从零开始重写sylar C++高性能分布式服务器框架和代码随想录中的文档。文章并不是对所有代码的详细解释,而是为了自己理解一些片段所做的笔记。

Coroutine类中其他函数的定义可以在这里查看:Github: src/coroutine.cpp

对于什么是协程,为什么要使用协程,可以看看之前的笔记:【协程】C++20协程初体验

对于我们自己来实现协程,其实在之前Xv6的Lab中就有做过:【MIT6.S081】Lab6 multithreading,当初做这个lab的时候没有意识到这就是协程。协程的切换最重要的就是要保存和恢复上下文,在这个lab中,我们通过保存每个协程在切换之前的寄存器的值,以此可用来恢复原来的执行流。

阅读全文 »

Debian系Linux安装N卡驱动参考这篇博客

最近Debian终于是装好nvidia的驱动了,但是只能用在X11上,并且相比于不用n卡驱动时的Wayland,X11下的窗口拖动和视频播放会有比较明显的撕裂感,以下是解决的一个方法。

阅读全文 »

我们知道在C++20的协程中,自己实现的Coroutine中必须包含一个Promise,并且这个Promise必须要实现:

  • get_return_object()
  • initial_suspend()
  • final_suspend()
  • unhandled_exception()

少了其中任何一个,编译器都会报错。那这是怎么实现的呢?如果是像java那样是一个接口而没有对应的实现从而报错还能理解,但是我们的代码中的Promise完完全全是我们自己写的,也没有使用继承,编译器你怎么知道我在实现协程时少了什么东西呢?

答案就是:SFINAE(Substitution Failure Is Not An Error,替换失败不是错误)。

阅读全文 »

前言

暑假里跟着鱼皮的yuindex项目写了个web终端的小玩具,完成的终端命令不多,但是大体上成型了。由于我打算做一个纯前端的项目,并没有写后端api,这样也方便我最终直接部署到Github Pages上(这样就不用花钱了hh)。

项目使用vite构建,并使用了ts。在构建部署时遇到了一些问题,由于是第一次将前端项目发布到github pages上,这里记录下。

阅读全文 »

在使用手机浏览器搜索时为了免于CSDN垃圾信息的影响,我们可以使用Bing(其他搜索引擎也有类似的功能,但是国内不借助其他方法的情况下体验感最好的也只有Bing了)的“-site:*.csdn.net”来屏蔽CSDN,但是每次输入搜索内容后还要加这么一个字符串真是太麻烦了,因此可以写一个浏览器脚本来完成这一操作。

阅读全文 »

在用C++刷leetcode时,我希望把一个递归函数像js、python那样写在运行函数内部,那么可以使用functionlambda表达式来实现。但如果这个递归函数的参数比较多,那么function的模板参数同样需要写很多,能不能用auto来实现得简单一点呢?

阅读全文 »
0%