- 主题:gcc是不是symmetric transfer的支持有问题?
swapcontxt(uc ,tc);
把任务从uc切换到tc,假定uc是堆,tc是栈,
那就是堆里的栈保存在uc,线程栈在tc,下一次swap就换回来。
【 在 hgoldfish 的大作中提到: 】
: 你再想想,你切换栈的时候,堆里指向栈的指针怎么办?
:
--
修改:ylh1969 FROM 221.221.55.*
FROM 221.221.55.*
举个例子:
void my_coroutine() {
Task task;
app()->task_manager->register_task(&task);
send_msg_to_remote();
}
你看这上面这段代码。Task 申请在栈里面。它把自己的指针传给了堆里面的 task_manager,所以 task_manager 保留了一个指向栈的指针对吧。
接下来开始进入阻塞的任务 send_msg_to_remote(),此时,协程被切换走。此时 task_manager 里面指向 task 的指针是不是就出问题了?
在 send_msg_to_remote() 没有返回之前,你肯定不会把栈内存给切换回来是吧。此时如果 task_manager 里面有一行代码:
task->finish()
你说会怎么样?
【 在 ylh1969 的大作中提到: 】
: swapcontxt(uc ,tc);
: 把任务从uc切换到tc,假定uc是堆,tc是栈,
: 那就是堆里的栈保存在uc,协程栈在tc,下一次swap就换回来。
: ...................
--
修改:hgoldfish FROM 110.84.121.*
FROM 110.84.121.*
你做的这个和云风那个类似。知乎上面有个分析云风 coroutine 库的系列文章,你可以去看一下。里面有很多分析。
【 在 ylh1969 的大作中提到: 】
: 我做的就是框架,其他用户用我的框架就行。他根本不需要知道什么是协程,什么是栈。
--
修改:hgoldfish FROM 110.84.121.*
FROM 110.84.121.*
c++的coroutine的确有传染问题,所以它有自己受限的使用场景。
我的感觉是,这个模型特别适合异步消息驱动模型,因为每个消息的处理都是相对独立的,可以从一个消息的处理函数入口斩断传染。消息驱动会有一个dispatch消息的loop,刚好用来resume挂起的协程。
并且消息驱动的核心代码少,需要高效简洁。可以让专业的人,使用传统方式实现和维护。(比方于用户代码和内核代码的区别),而项目的主要部分是消息处理函数,用coroutine来写,逻辑更加清楚。也降低了对程序员的水平要求。
我写了一段时间,有了一些不成熟的感悟,提出来供大家批判。
- 来自 水木社区APP v3.5.7
【 在 hgoldfish 的大作中提到: 】
: 这就是 await 这个语法传染性的问题了。
:
: 和内存管理不是一回事。
:
: 反正我也不看好 c++20 的协程。但同时也指出你用 ucontext 没问题,只是额外搞的这个栈内存切换是在风险的。
--
FROM 182.129.60.*
对啊。coroutine 就是为了对付所有的异步调用。有了 coroutine 以后就再也不需要回调函数了。
你可以看看 python, js, c# 程序员在十年前已经用上 coroutine,用来写网络程序。
除此之外,还有 python 的:
for i in range(10):
print(i)
这个 range() 函数也是个协程。也就是 c++20 里面所谓的对称转移,主贴所讨论的场景。
你在主贴里面实现是两个协程来回切换。
用于驱动各种异步事件的时候,得弄个事件循环协程:
<-> coro1(send)
ev_coro <-> coro2(recv)
<-> coro3(timer)
你主贴的场景和 range() 是:
main <-> range()
这种两个协程切来切去还有个绝佳用途就是编译器:
parser <-> lexer
【 在 allegro 的大作中提到: 】
: c++的coroutine的确有传染问题,所以它有自己受限的使用场景。
: 我的感觉是,这个模型特别适合异步消息驱动模型,因为每个消息的处理都是相对独立的,可以从一个消息的处理函数入口斩断传染。消息驱动会有一个dispatch消息的loop,刚好用来resume挂起的协程。
: 并且消息驱动的核心代码少,需要高效简洁。可以让专业的人,使用传统方式实现和维护。(比方于用户代码和内核代码的区别),而项目的主要部分是消息处理函数,用coroutine来写,逻辑更加清楚。也降低了对程序员的水平要求。
: ...................
--
修改:hgoldfish FROM 110.84.121.*
FROM 110.84.121.*
使用现成的轮子,问题就在这里,我不知道stack_manager()里边干了啥,出了问题就很难找。
如果这个函数是自己写的,不会暴露给用户,他们理解不了这里边想干啥。
我会把整个异步IO协程框架封装起来,搞好一切资源后,调用应用函数,应用程序员只写应用逻辑,至于是谁,什么机制,进程?线程?协程?来调用,不用管。当然,会告诉他们运行环境及注意事项。资源参数配置他们可以直接配置文件干。
【 在 hgoldfish 的大作中提到: 】
: 举个例子:
: void my_coroutine() {
: Task task;
: ...................
--
修改:ylh1969 FROM 221.221.55.*
FROM 221.221.55.*
我举例的 task_manager 是个普通类型。不是啥特别的东西。
关键你仔细看 &task 这个参数。。
【 在 ylh1969 的大作中提到: 】
: 使用现成的轮子,问题就在这里,我不知道stack-manage()里边干了啥,出了问题就很难找。
--
FROM 110.84.121.*
我不会这么用。
我的task里保留的是uc(user context 协程栈)和tc(thread context,线程栈),两套环境的动态资源,想切哪个切哪个。
你说的这些,man一下ucontext应该有完整说明。
【 在 hgoldfish 的大作中提到: 】
: 举个例子:
: void my_coroutine() {
: Task task;
: ...................
--
修改:ylh1969 FROM 221.221.55.*
FROM 221.221.55.*
就问你在stackless协程里能调用数据库吗?
玩ATM服务器,IO完了就是数据库,数据库完了就是IO,你咋整?
【 在 hgoldfish 的大作中提到: 】
: 这就是 await 这个语法传染性的问题了。
: 和内存管理不是一回事。
: 反正我也不看好 c++20 的协程。但同时也指出你用 ucontext 没问题,只是额外搞的这个栈内存切换是在风险的。
: ...................
--
修改:ylh1969 FROM 221.221.55.*
FROM 221.221.55.*
我干完这个事还没有风云呢。
【 在 hgoldfish 的大作中提到: 】
: 你做的这个和云风那个类似。知乎上面有个分析云风 coroutine 库的系列文章,你可以去看一下。里面有很多分析。
:
--
FROM 221.221.55.*