windows下的协程

协程coroutine的作用主要是 在用户管理并行逻辑间的切换, 不像线程thread那样, 交由系统控制运行下 需要 锁 唤醒 条件栅栏 类似这些的同步方式组织协作。  协程可以让用户精确控制在某个时刻下运行那块逻辑, 因为相关联的协程都在一个thread里运行, 所以不需要考虑资源互斥的那些东西,  同时协程在用户态下保留了各个寄存器,栈顶和栈底,异常信息,浮点寄存器 这种上下文信息, 让代码写起来更自然

一直以为协程是脚本语言的特性, 最近碰巧看到原来windows下很早就支持协程的操作了, 只是另取了个名字 纤程 Fiber 。这点不得不佩服微软的工程师门, 好端端的又整一个概念出来, 想想之前的NMAKE. 微软总要把一些成熟的东西贴上自己的标签。 为了方便记忆我还是爱用协程这个名字。


协程用起来比较简单,api也就那几个

CreateFiber 创建一个协程 ,需要传入堆栈大小,运行入口,参数指针 ,返回一个协程的执行地址 ,用来 switch用

ConvertThreadToFiber 把当前线程转换成一个协程, 只需要传入一个参数指针,  因为运行入口是执行完ConvertThreadToFiber后的下一段代码 堆栈也为线程的堆栈, 同样返回一个协程的执行地址。 这个调用主要用于主控的协程, 等同于多线程下的 main 线程,  mainfiber 可以这么理解

SwitchToFiber 主动切换协程,等于 yield 和 resume的合体, 只是没那么自然也不能传递参数, 需要参数指定 协程的执行地址, 就是上面2个接口返回的那个值

GetCurrentFiber 取得当前执行协程的 执行地址, 主要作用可能是给某些公用接口来区分协程类型来实现不同逻辑

GetFiberData 取得当前协程在创建时传入的参数指针, 这个指针一般在ConvertThreadToFiber调用前 alloc好, mainfiber可以直接访问,而其他的协程必须通过入口参数取得,公用函数则用GetFiberData取 

FiberProc 为协程方法的函数指针类型

猜你喜欢

转载自blog.csdn.net/evilswords/article/details/39496733