当前位置: 首页 > news >正文

云南网站公司网页设计html如何换行

云南网站公司,网页设计html如何换行,化工原材料网站建设,手机在线电影网站ucontext_t结构体、非对称协程 协程类 ucontext_t结构体 头文件中定义的四个函数#xff08;getcontext(), setcontext(), makecontext(), swapcontext()#xff09;和两个结构类型#xff08;mcontext_t, ucontext_t#xff09;在一个进程中实现用户级的线程切换。 其中… ucontext_t结构体、非对称协程 协程类 ucontext_t结构体 头文件中定义的四个函数getcontext(), setcontext(), makecontext(), swapcontext()和两个结构类型mcontext_t, ucontext_t在一个进程中实现用户级的线程切换。 其中mcontext_t类型与机器相关不透明ucontext_t结构体至少包含以下几个域 typedef struct ucontext {struct ucontext *uc_link;sigset_t uc_sigmask;stack_t uc_stack;mcontext_t uc_mcontext;... } ucontext_t;当当前上下文运行终止时系统会恢复uc_link指向的上下文uc_sigmask为该上下文中的阻塞信号集合uc_stack为该上下文中使用的栈uc_mcontext保存的上下文的特定机器表示包括调用线程的特定寄存器等。 下面是这四个函数的详细介绍 int getcontext(ucontext_t *ucp);初始化ucp结构体将当前的上下文保存到ucp中。 int setcontext(const ucontext_t *ucp);设置当前的上下文为ucpsetcontext的上下文ucp应该通过getcontext或者makecontext取得。如果调用成功则不返回。如果上下文是通过调用getcontext()取得程序会继续执行这个调用从该上下文的状态开始继续执行即调用getcontext处后接着执行。如果上下文是通过调用makecontext取得程序会调用makecontext函数的第二个参数指向的函数如果func函数返回则恢复makecontext第一个参数指向的上下文。如果uc_link为NULL则线程退出。 void makecontext(ucontext_t *ucp, void (*func)(), int argc, ...);makecontext修改通过getcontext取得的上下文ucp这意味着调用makecontext前必须先调用getcontext。然后给该上下文指定一个栈空间ucp-stack设置后继的上下文ucp-uc_link。当上下文通过setcontext或者swapcontext激活后执行func函数argc为func的参数个数后面是func的参数序列。当func执行返回后继承的上下文被激活如果继承上下文为NULL时线程退出。 int swapcontext(ucontext_t *oucp, ucontext_t *ucp);保存当前上下文到oucp结构体中然后激活upc上下文。如果执行成功getcontext返回0setcontext和swapcontext不返回如果执行失败getcontext,setcontext,swapcontext返回-1并设置对应的errno。 小结一下 makecontext初始化一个ucontext_t,func参数指明了该context的入口函数argc为入口参数的个数每个参数的类型必须是int类型。另外在makecontext前一般需要显示的初始化栈信息以及信号掩码集同时也需要初始化uc_link以便程序退出上下文后继续执行。 swapcontext原子操作该函数的工作是保存当前上下文并将上下文切换到新的上下文运行。 getcontext将当前的执行上下文保存在cpu中以便后续恢复上下文 setcontext将当前程序切换到新的context,在执行正确的情况下该函数直接切换到新的执行状态不会返回。 ⾮对称模型 非对称协程asymmetric coroutines是跟一个特定的调用者绑定的协程让出CPU时只能让回给调用者。何为非对称呢在于协程的调用(call/resume)和返回(return/yield)的地位不对等。程序控制流转移到被调用者协程而被调用者只能返回最初调用它的协程。 对称协程symmetric coroutines在于协程调用和返回的地位是对等的。启动之后就跟启动之前的协程没有任何关系了。协程的切换操作一般而言只有一个操作yield用于将程序控制流转移给其他的协程。对称协程机制一般需要一个调度器的支持按一定调度算法去选择yield的目标协程。 这里采用的是非对称模型 保证⼦协程不能再创建新的协程即协程不能嵌套调⽤⼦协程只能与主线程进行切换。注意下图中子协程只能切换回主协程不能创建新的子协程。 对于非对称协程⼦协程和⼦协程切换导致线程主协程跑⻜的关键原因在于每个线程只有两个线程局部变量⽤于保存当前的协程上下⽂信息。也就是说线程任何时候都最多只能知道两个协程的上下⽂其中⼀个是当前正在运⾏协程的上下⽂另⼀个是线程主协程的上下⽂如果⼦协程和⼦协程切换那这两个上下⽂都会变成⼦协程的上下⽂线程主 协程的上下⽂丢失了程序也就跑⻜了。 简化协程状态 只设置三种协程状态就绪态、运⾏态和结束态⼀个协程要么正在运⾏RUNNING要么准备运⾏READY要运⾏ 结束TERM。 协程操作 协程创建操作 创建线程主协程只需要将协程设置为当前运行协程协程转为RUNING获取当前上下文。 创建⽤户协程则需要额外创建栈空间和绑定协程入口函数 /** * brief 线程主协程构造函数 * attention ⽆参构造函数只⽤于创建线程的第⼀个协程也就是线程主函数对应的协程 * 这个协程只能由GetThis()⽅法调⽤所以定义成私有⽅法 */ Fiber::Fiber(){SetThis(this);m_state RUNNING;if (getcontext(m_ctx)) {Fzk_ASSERT2(false, getcontext);}s_fiber_count;m_id s_fiber_id; // 协程id从0开始⽤完加1Fzk_LOG_DEBUG(g_logger) Fiber::Fiber() main id m_id; }/** * brief 构造函数⽤于创建⽤户协程 * param[] cb 协程⼊⼝函数 * param[] stacksize 栈⼤⼩ */ Fiber::Fiber(std::functionvoid() cb, size_t stacksize): m_id(s_fiber_id), m_cb(cb) {s_fiber_count;m_stacksize stacksize ? stacksize : g_fiber_stack_size-getValue();m_stack StackAllocator::Alloc(m_stacksize);if (getcontext(m_ctx)) {Fzk_ASSERT2(false, getcontext);}m_ctx.uc_link nullptr;m_ctx.uc_stack.ss_sp m_stack;m_ctx.uc_stack.ss_size m_stacksize;makecontext(m_ctx, Fiber::MainFunc, 0);Fzk_LOG_DEBUG(g_logger) Fiber::Fiber() id m_id; }协程间执行权转换操作 resume将协程非TERM、RUNNING状态设置为当前运行协程协程转为RUNING恢复协程运行 yield将主协程设置为当前运行协程协程转为READY让出执⾏权 主要区别前者将保存线程主协程上下文并切换运行子协程的上下文前者将保存子协程上下文并切换运行主协程的上下文 /// brief 恢复协程运行 ///恢复该协程的运行。 void Fiber::resume() {Fzk_ASSERT(m_state ! TERM m_state ! RUNNING);SetThis(this);m_state RUNNING;//涉及后面的协程调度如果协程参与调度器调度那么应该和调度器的主协程进行swap而不是线程主协程// if (m_runInScheduler) {// if (swapcontext((Scheduler::GetMainFiber()-m_ctx), m_ctx)) {// Fzk_ASSERT2(false, swapcontext);// }// } else {// if (swapcontext((t_thread_fiber-m_ctx), m_ctx)) {// Fzk_ASSERT2(false, swapcontext);// }// }//发生段错误已解决是新创建的子协程未保存其上下文导致m_ctx对未初始化对象进行取地址操作if (swapcontext((t_thread_fiber-m_ctx), m_ctx)) {Fzk_ASSERT2(false, swapcontext);} } /// brief 当前协程让出执⾏权 ///当前协程让出执⾏权, 当前协程的状态有两种情况1、协程函数未执行完更新为READY; 2、执行完更新为TERM void Fiber::yield() {/// 协程运行完之后会自动yield一次用于回到主协程此时状态已为结束状态Fzk_ASSERT(m_state RUNNING || m_state TERM);SetThis(t_thread_fiber.get());if(m_state ! TERM) {m_state READY;}// 如果协程参与调度器调度那么应该和调度器的主协程进行swap而不是线程主协程// if(m_runInScheduler) {// if(swapcontext(m_ctx, (Scheduler::GetMainFiber()-m_ctx))) {// Fzk_ASSERT2(false, swapcontext);// }// } else {// if (swapcontext(m_ctx, (t_thread_fiber-m_ctx))) {// Fzk_ASSERT2(false, swapcontext);// }// }if (swapcontext(m_ctx, (t_thread_fiber-m_ctx))) {Fzk_ASSERT2(false, swapcontext);} }后续工作实现协程调度类 为使得协程类能够通过调度器来运⾏需要对已实现的协程类进行以下具体操作 给协程类增加⼀个bool类型的成员m_runInScheduler⽤于记录该协程是否通过调度器来运⾏。创建协程时根据协程的身份指定对应的协程类型具体来说只有想让调度器调度的协程的 m_runInScheduler值为true线程主协程和线程调度协程的m_runInScheduler都为false。resume⼀个协程时如果如果这个协程的m_runInScheduler值为true表示这个协程参与调度器调度那它应该和三个线程局部变量中的调度协程上下⽂进⾏切换同理在协程yield时也应该恢复调度协程的上下⽂表示从⼦协程切换回调度协程如果协程的m_runInScheduler值为false表示这个协程不参与调度器调度那么在resume协程时直接和线程主协程切换就可以了yield也⼀样应该恢复线程主协程的上下⽂。m_runInScheduler值为false的协程。上下⽂切换完全和调度协程⽆关可以脱离调度器使⽤。
http://www.pierceye.com/news/505847/

相关文章:

  • 肃宁县做网站价格wordpress获取站点标题
  • 公司做网站效果怎么样推荐网站建设话术
  • 邱县网站建设河北seo网络优化师
  • iis5.1怎么新建网站中国生意网
  • 教你做吃的网站厦门市集美区建设局网站
  • 电子商务网站建设需要青岛网站建设邓巴迪
  • 网站建设考虑的因素建设网站地图
  • 天津塘沽网站建设新网官方网站
  • 做本地团购网站国外产品网站
  • 湖北省两学一做网站国外浏览器app下载
  • 遵义网站建设公司巴彦淖尔市网站制作
  • 后台管理系统网站模板合作网站登录制作
  • 腾讯云网站备案流程seo优化实训总结
  • 那个网站有免费的模板wordpress首页模板文件
  • 阿里云主机可以放几个网站手机上自己设计广告的软件
  • 南通公司企业网站建设淘宝网店制作
  • 长沙网站建设推广太仓网站建设企业网站
  • 加强网站微信信息编辑队伍建设网站设计 北京店
  • 广州网站建设有限公司程序员入门先学什么
  • 资源下载类网站如何做外链北京有几家宽带网络公司
  • 个人网站要有什么网页设计与制作初学者教程
  • 宁波品牌网站建设芗城区建设局网站
  • 仿卢松松博客网站源码购买网站空间多少钱
  • 无锡网站推微信公众号文章里好看的图片在哪个网站做
  • 做网站建设费用预算龙岩市建筑设计院
  • 网站做适配多少钱浙江建设厅特种考试查询
  • 简单的网站更新 关键词优化 关键词互联如何做网
  • 重庆网站seo搜索引擎优化网站qq登录 开发
  • 备案号放网站下面居中物流网站制作目的
  • 房产网站排名做情侣网站