菜菜博士

博士在网络的家

用iouring扩展asio

序 什么叫扩展asio? Beast给Asio增加了 HTTP 协议,不叫扩展asio。那什么叫扩展asio? 举个例子,给 asio 的 socket 对象,基于io_uring提供的 IORING_OP_SHUTDOWN 增加 async_shutdown() 接口,就算扩展asio。因为原本asio并没有异步shutdown功能。而且这个功能并不能靠组合原有的asio接口实现。这就叫...

重叠IO(proactor)是最理想的IO模型

reactor 和 proactor , 这种毫无联系的英文专用名词,很容易把人弄晕。 回归正途,使用精确的汉语描述,而非翻译,则正确的说法是: 多路复用IO 和 重叠 IO 模式。 所谓多路复用,顾名思义,就是好几个IO复用。。。 复用了谁?复用了线程。 它对比的是最传统的UNIX网络编程: 一个连接一个线程。并发就要开多线程。连接多了,线程就多,系统压力非常大。 而多路复用,则可以...

真正的重叠IO

不知有没有人想过,为何微软将windows 的异步API称为“重叠IO”而不是异步IO。 在我看来,重叠IO和异步IO的区别,主要在于发起IO后的动作。 重叠IO, 发起 IO 后,继续执行应用层的逻辑。应用可以选择在任何何时的地点再选择同步(阻塞等待 or 异步等待)IO的结果。 异步IO, 发起 IO 后,立即挂起当前业务逻辑(也就是立即非阻塞等待 IO 结果),回到事件循环,以便执...

不要 new 一个 char 数组当缓冲区

性能调优是一个有魔力的工作。最近研究到了 std::pmr::, 就想着看能否有些老代码能改进改进,提高下性能。 但是,测试的时候,发现还是有一些路径的效率不理想。 经过好久的排查,最终定位代码到这么一行 auto buffer_size = 5*1024*1024; auto buffer = std::make_unique<char[]>(buffer_size); ...

用本机 clang 进行交叉编译

你在 A 平台上编译一份代码,编译出来的结果,在 A 平台无法运行,只能在 B 平台运行。这个就叫交叉编译。 通常使用交叉编译,是因为 B 平台太弱鸡,性能无法胜任编译工作。 因此大部分交叉编译,都是发生在 x86 上为 arm 编译。 为了进行交叉编译,你需要使用一种专门为交叉编译而开发的工具 —— 交叉编译器。 在 Gentoo 上,交叉编译器可以使用工具 ”crossdev” ...

可变模板参数包迭代

序 如果你写了一个模板函数,模板函数里使用了 可变参数。比如你写了个 template<typename... Args> int print(Args... args); 那么,要如何去访问这些可变的参数呢? 方法 1 使用递归法。比如定义2个 print, 一个是单参数的,另一个是 2个模板参数的。 template<typename Arg> in...

把闭包变成函数指针—— trampoline 原理解析

序 十年前,我曾经写过一个让 C 形式的回调函数支持 闭包的小转换工具, 见这。 那时候,我说过,要想把 boost.function 传给 C 接口,那这个 C 接口,必须得带一个 void* user_data 的参数。 比如 typedef int (*callback_t)(int arg1, int arg2, void* user_data); bool registe...

重提类型擦除器

序 十年前,我曾经写过一篇有关类型擦除器的文章, 见这。 十年后,我打算再探讨下类型擦除器。 C++ 对 多态 的支持,在核心层面,就两条: 虚继承 和 模板。 假设你要设计一个 线程池。这个池你可以“投递”各种任务进去。 什么叫”任务“呢? 就是一段代码。于是,早期你想到,可以使用 函数指针。 于是你的 线程池长这样 class threadpool { typedef v...

类型萃取技术:函数签名当模板参数

序 在 上一篇 文章里,我提到了 std::function 的模板参数,是一个叫函数签名 的东西。 什么是函数签名? 比如 main 函数,他的签名是 int(int, char**)。所谓函数签名,是指函数声明去掉 函数名和变量名 后得到的一个精简描述。 这个精简描述,指导编译器如何按”调用约定“产生具体的汇编指令以调用一个函数。 函数名,不过是在最后的 call 指令里,提供了...

不需要void*user_data的闭包封装

一般来说,如果 C api 接受一个回调,通常会额外允许设置一个 void* 的回调参数。 用户可以把一些额外的参数用这个 void* 传给回调函数。 比如 typedef void (*read_function_t)(const char* read_buf, int read_size, void* user_data); int register_read_callback(re...

微软不会起名

微软不会起名,而且名字还具有极大的误导性。 先说类名: 首先,微软的协程原作者,他总是用 Task<> 来命名一个协程函数。但是这就是他犯的第一个错误。 因为只有 await 构成的一系列调用,那条调用链才是一个 “任务”。 也就是 asio 作者所说的 co_spawn. 只有被 spawn 出来的协程,才叫一个任务。而被 await 的函数,不能叫任务,而是”可异步等待返...

西方饮食的超高热量

西洋人做食物,最喜欢放的一种调料,叫“黄油”。没有黄油洋人就活不下去。 洋人对黄油的喜爱到了何种地步? 制作面包的时候, 是 面粉+白糖+黄油 1:1:1 混合。烤熟后的面包,吃之前要抹黄油。 偏偏黄油(butter)在英语里,不带油字。做出来的面包,也没有油腻腻的视觉观感。 于是乎,洋人就会说,中国人吃的炒菜放超级多的油,不健康。他们吃的面包就很健康。 其实西洋面包,里面的油,比肉...

从模板的模板论程序员的美学

在编写 µcoro 的时候,曾经对一个模板类的成员函数犯难了。那就是等待器三件套之一的 await_suspend 函数。 我为template<typename T> class awaitable 的三件套使用这样一个模板签名 template<typename PromiseType> auto await_suspend(std::coroutine_ha...

老王语录

苹果手机目前在国内主要就是果粉和小姐在用。 国人大部分开源的项目压根就没有什么洋人感兴趣,不过就是一厢情愿的跪舔洋人而已。 这些觉的自己母语低一等的人啊,往往又经常在简中社区求关注。 8k没意义?那些保守党早在1080p时就说过同样的话,不需要4k,如果不是科技推着他们走,他们什么都不需要,电脑也是多余的,他们会说,...

µcoro 介绍

什么是 µcoro (ucoro) µcoro 是一个最小化的c++20协程库。精简到不能再删一行代码。 什么是 c++20协程 要理解 c++20 协程,首先要理解 无栈协程。 要理解无栈协程,首先要理解“调用链”。 调用链 函数,是被“调用”的。函数 A 调用 函数 B, 函数 B 再调用 函数 C。意思就是当 C 执行完工作,它返回就会回到 B 函数里调用C的那个地方。然后...

猪油有利于减肥

为啥会肥胖 要减肥,首先要理解,人为什么会变肥。 人要活着就要消耗能量。而人体的能量来源,主要靠葡萄糖。 人体有两大储能系统: 血液和脂肪。 血液里含有葡萄糖,这是直接储蓄,类比为“活期存款”。血糖会随着代谢的进行被源源不断的消耗,同时也会随着消化的进行,源源不断的被补充进来。 如果血糖的浓度偏离了一个正常值,就会激发人体的代偿机制: 将多余的葡萄糖转换为脂肪或者反过来,将多余的脂...

同居是没有保障的婚姻

现代女性恐惧婚姻,却不恐惧同居。反而欣欣向荣。 然而,同居就是没有保障的婚姻。女人对法律给予的保障十分的恐惧,反而喜欢裸奔。 为啥同居就是没有保障的婚姻呢? 因为现行的婚姻法,对女性的约束力几乎没有,写满了对男性的约束力。对男人来说,结婚的性价比太低,不如同居划算。因为结婚了,也不能约束伴侣。反而自己被法律给管辖起来了。 倒不如只同居,不结婚。这样双方都是裸奔,都没有法律保护。那就看谁在...

航天应用下参考系的选取

这俩月,航天的话题比较热。吸引了我的全部注意力。 只是跟着热点跑,那我也就不是我了。 以前高中学习万有引力的时候,从未考虑过的事情,突然变得烦恼起来。那就是,在航天领域,用的是什么坐标系? 火箭要送卫星上天,必须要靠导航。导航导航,导引航迹。必须得知道自己在哪。 知道自己在哪,就必须得描述出来。 在地面上,位置可以用 经纬度+高度 表达。在地面运动的物体,也直接拿地面当惯性参考系。 ...

中国古人的天地宇宙观

在学习世界历史的时候,我知道麦哲伦16世纪完成了环球航行。于是证明了地球是个球。地圆说终于获得实捶证据。从此天圆地方再无市场。 但是,麦哲伦那个时代,一定是对于大地到底是平的还是圆球的,争论不休。也就是说,有相当的一部分人认为,大地是个球。只不过没有实际的证据。 那,这些早就认为大地是球的人,他们的认知来自何方? 这种明显偏离日常经验的知识,必然是源自经年累月的思考和观察。 而且,这样...

物业就是现代版的皇权不下乡

皇权不下乡 在古代,皇权的主要目的就是征税和征兵。而征税是可以“外包”的,征兵后来被“募兵”取代。 于是,维持到村的基层治理体系就变得毫无意义。所谓皇权不下县,就是在县以下的行政单位基本上靠“士绅”自治。 其实古代皇权不下县到明清时代才特别明显。秦汉时期,皇权不仅要下县,还要扎根在村里。 因为秦朝的 “耕战” 制度,全民皆兵。每有战争,皇帝就要派人到村里挨家挨户的征兵。 在工业社会到...