IT评测·应用市场-qidao123.com技术社区

标题: 【sylar-webserver】5 协程调理模块 [打印本页]

作者: 科技颠覆者    时间: 2025-3-27 16:01
标题: 【sylar-webserver】5 协程调理模块
协程调理模块,必要把前面的线程模块和协程模块结合使用 ~
计划思路


重要的函数:
重要的变量:

具体调理必要细分情况:

三种协程的切换

对于 主协程,调理协程,任务协程。
重构了 协程模块 里的 yield 和 resume
yield:任务协程 --> 调理协程 —> 主协程
resume: 主协程 —> 调理协程 —> 任务协程
Fiber增长一个类变量
bool m_runInScheduler; // 本协程是否参与调理器调理,相当于当前协程是否是任务协程。
  1. void Fiber::yield(){
  2.         SYLAR_ASSERT(m_state == TERM || m_state == RUNNING)     // 当前子协程可以是 TERM,RUNNING
  3.         if(m_state != TERM){    // 如果没有结束,中途进行yield,状态设置为READY,可能还会回来继续执行。
  4.         m_state = READY;
  5.     }
  6.         if(m_runInScheduler){
  7.                 if(swapcontext(&m_ctx, &(Scheduler::GetMainFiber()->m_ctx))){
  8.                         ...
  9.                 }
  10.         }else{
  11.                 if(swapcontext(&m_ctx, &(t_thread_fiber->m_ctx))){
  12.                         ...
  13.                 }
  14.         }
  15. }
  16. void Fiber::resume(){
  17.         SYLAR_ASSERT(m_state == READY);
  18.         // 切换前,提前设置状态和 当前线程运行的协程。
  19.         SetThis(this);
  20.         m_state = RUNNING;
  21.         if(m_runInScheduler){ // 相当于当前协程,是任务协程。 t_scheduler_fiber --> t_fiber
  22.                 if(swapcontext(&(Scheduler::GetMainFiber()->m_ctx), &m_ctx)){
  23.                         ...
  24.                 }
  25.         }else { // t_thread_fiber --> t_scheduler_fiber
  26.                 if(swapcontext(&(t_thread_fiber->m_ctx), &m_ctx)){
  27.                         ...
  28.                 }
  29.         }
  30. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4