- 主题:C++的异步模型以后就是sender/receiver这个框架了
各种事件工具都是可以的。我感兴趣怎么用IOCP。
至于你说的语法糖,当然可以用,习惯问题,我看不出来必要性。
语法解释,词法分析,我也常用。
看了你的流程,感觉就是主流程与子流程掉了个个,可以,但不是必须。
【 在 hgoldfish 的大作中提到: 】
: 首先,可以不存在事件循环。协程之间自行切换。例子是 generator 模式。我在写编译器的时候,lexer 和 compiler 都是协程,它俩来回切换。
: 其次,存在没有 io poll 的事件循环。也就是纯粹的 timer 循环。事件循环里面只有 timer 事件,没有其它事件。
: 最后呢,事件循环不一定用 epoll. windows 下也可以用 iocp, linux 下还有 io_uring 等等。
: ...................
--
修改:ylh1969 FROM 221.218.61.*
FROM 221.218.61.*
不是语法糖。我说的也是 c++ 的啊。
我这边有个核心工具,用 c++ 写的 olap 时间序列数据库。它包含一个表达式引擎。
里面的 lexer 和 compiler 就是用两个协程来回切换,没有用到任何事件循环。
【 在 ylh1969 的大作中提到: 】
: 各种事件工具都是可以的。
: 至于你说的语法糖,当然可以用,习惯问题,我看不出来必要性。
: 语法解释,词法分析,我也常用。
: ...................
--
FROM 27.152.110.*
可以可以,我没有任何异议。
你说的io_uring,AI了一下,是个好东西。我算是抛砖引玉,谁感兴趣的,把epoll换成io_uring。
我用过kqueue,比epoll好用。
【 在 hgoldfish 的大作中提到: 】
: 不是语法糖。我说的也是 c++ 的啊。
: 我这边有个核心工具,用 c++ 写的 olap 时间序列数据库。它包含一个表达式引擎。
: 里面的 lexer 和 compiler 就是用两个协程来回切换,没有用到任何事件循环。
: ...................
--
FROM 221.218.61.*
io_uring 基本工作原理
环形缓冲区:包含两个核心环形队列——提交队列(SQ)和完成队列(CQ)。
提交请求:用户将 I/O 请求(如读、写)放入 SQ,通知内核处理。
内核处理:内核从 SQ 取出请求并执行,完成后将结果放入 CQ。
获取结果:用户从 CQ 中读取完成的请求结果,进行后续处理。
从cq取,得有事件通知吧?
【 在 hgoldfish 的大作中提到: 】
: 首先,可以不存在事件循环。协程之间自行切换。例子是 generator 模式。我在写编译器的时候,lexer 和 compiler 都是协程,它俩来回切换。
: 其次,存在没有 io poll 的事件循环。也就是纯粹的 timer 循环。事件循环里面只有 timer 事件,没有其它事件。
: 最后呢,事件循环不一定用 epoll. windows 下也可以用 iocp, linux 下还有 io_uring 等等。
: ...................
--
修改:ylh1969 FROM 221.218.61.*
FROM 221.218.61.*
曾经用过一套库,好像是st-thread之类的,
底层部分实现,手工用汇编存储几个寄存器的值,再用setjmp, longjmp切换,效率更高。
【 在 ylh1969 的大作中提到: 】
: 他已经是最简代码了。没办法比它更快,所有其他协程,包括各种语言的,都是以它为基础,不可能比它快。
: getcontext,保存现场到ucontext。
: setcontext,从ucontext恢复现场。
: ...................
--
FROM 125.33.201.*
那几个函数就是如此。
【 在 liangyue 的大作中提到: 】
: 曾经用过一套库,好像是st-thread之类的,
: 底层部分实现,手工用汇编存储几个寄存器的值,再用setjmp, longjmp切换,效率更高。
:
--
FROM 221.218.61.*
反正我是用不上了,那时候早退休了
【 在 z16166 的大作中提到: 】
: Eric Niebler搞的P2300(std::execution)要在C++26里正式纳入标准。C++20的ranges也是他搞的。
: "泛型函数式组合"是他喜欢的风格
: 英伟达针对P2300的实现stdexec现在风头正劲
: ...................
--
FROM 222.129.48.*
其实看看boost协程就知道了啊, 信号相关、一些寄存器处理
【 在 ylh1969 的大作中提到: 】
: 他已经是最简代码了。没办法比它更快,所有其他协程,包括各种语言的,都是以它为基础,不可能比它快。
: getcontext,保存现场到ucontext。
: setcontext,从ucontext恢复现场。
: ...................
--
FROM 101.226.143.*
担心的是各种CPU不兼容,有些新寄存器没有保存,协处理器任务未完成等等。
【 在 RichyMong 的大作中提到: 】
: 其实看看boost协程就知道了啊, 信号相关、一些寄存器处理
--
FROM 221.218.61.*
自己维护纤程的情况还是不少的,我以前一个项目用到了lua,lua里又调用了pgsql,业务要求lua脚本不能阻塞住它的线程,就需要把lua的pgsql的接口实现为非阻塞,再实现一套co_yield将控制权还给它的线程,线程处理完其它事情并查询到pgsql已经完成事务,再把控制权还给lua让脚本继续执行。我在Linux下用的是swapcontext / makecontext / getcontext(POSIX 2001,已废弃),这些函数曾是实现协程的经典方式,但 POSIX.1-2008 已废弃它们。
现在想用就是汇编的实现比如boost.context,或者C++20的co_await那套无栈式协程,性能更好。
【 在 hgoldfish 的大作中提到: 】
: 首先,可以不存在事件循环。协程之间自行切换。例子是 generator 模式。我在写编译器的时候,lexer 和 compiler 都是协程,它俩来回切换。
: 其次,存在没有 io poll 的事件循环。也就是纯粹的 timer 循环。事件循环里面只有 timer 事件,没有其它事件。
: 最后呢,事件循环不一定用 epoll. windows 下也可以用 iocp, linux 下还有 io_uring 等等。
: ...................
--
修改:poocp FROM 171.221.52.*
FROM 171.221.52.*