举个例子:
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.*