Windows下实现协程-Coroutine
来源:互联网 发布:阿里云和腾讯云哪个好 编辑:程序博客网 时间:2024/05/17 16:44
Widnows 是提供了用户级线程的,类似 coroutine 需要用户主动是切换。这在单线程程序中非常有用。线程调度模块只负责提供堆栈,环境的保存。不负责分配时间片等。
自己实现 coroutine 并不难,但能用操作系统提供的可以得到更多的便利。Windows 中把这种用户级线程叫做 Fiber,纤维的意思。比较通用的译名是纤程。
我们可以把一个 thread 转换成一个 fiber ,用到的 API 是 ConvertThreadToFiber。其实用的更多的是CreateFiber,它可以创建一个纤程,但并不切换过去运行。
被创建出来的 Fiber 会有一个上下文的地址被返回,用于以后的切换操作。我们可以用 SwitchToFiber 来切换。这是唯一用于 Fiber 释放操作权的途径。SwitchToFiber 必须显式的指定切换的目标,所以 Fiber 调度的工作需要我们自己写代码来实现。
GetCurrentFiber 和 GetFiberData 这两个函数都很有用,一个用来取到运行环境,一个用来取得创建参数,这两个函数都是用 inline 函数的形式提供在 .h 文件中的。
Fiber,也就是纤程,完全运行在用户态,各个线程的切换也只在用户态完成避免了系统调用,所以切换开销较小。线程的调度,通常是由操作系统的线程调度器完成,在现代OS中,通常使用抢占式调度策略。而纤程的调用,完全依赖于程序员自己,即实现一种合作式调度,只有在主动提出切换时,才会进行切换。
多线程的程序很多不是为了提高效率,充分利用多 CPU,而是为了逻辑描述方便。
纤程往往可以提供更加便捷的描述,因为它只能通过 SwitchToFiber 显式切换,这样可以少许多加解锁的过程。而且切换的效率也比真正的线程来的高。
Fiber 就是一种 coroutine 的实现,而 coroutine 其实是一种常见的算法表达方式。只是 C 语言和其衍生的基于一个环境堆栈的语言并没有直接支持。所以才少为人知。
纤程用于化异步为同步。
你可以进行一个异步操作以后就切换纤程,等到异步操作完成以后在切换回来,这样,在逻辑上相关的代码就可以写到一个函数里面,而不用人为的分到多个回调函数中
fiber 的好处应该可以减轻锁的顾虑。在没有主动切换上下文之间,可以看成是原子操作。
要自己实现fiber,主要是保存线程上下文。注意要保存的信息有:各个寄存器,栈顶和栈底,异常信息,浮点寄存器。 window Fiber的默认堆栈是1M
自己实现 coroutine 并不难,但能用操作系统提供的可以得到更多的便利。Windows 中把这种用户级线程叫做 Fiber,纤维的意思。比较通用的译名是纤程。
我们可以把一个 thread 转换成一个 fiber ,用到的 API 是 ConvertThreadToFiber。其实用的更多的是CreateFiber,它可以创建一个纤程,但并不切换过去运行。
被创建出来的 Fiber 会有一个上下文的地址被返回,用于以后的切换操作。我们可以用 SwitchToFiber 来切换。这是唯一用于 Fiber 释放操作权的途径。SwitchToFiber 必须显式的指定切换的目标,所以 Fiber 调度的工作需要我们自己写代码来实现。
GetCurrentFiber 和 GetFiberData 这两个函数都很有用,一个用来取到运行环境,一个用来取得创建参数,这两个函数都是用 inline 函数的形式提供在 .h 文件中的。
Fiber,也就是纤程,完全运行在用户态,各个线程的切换也只在用户态完成避免了系统调用,所以切换开销较小。线程的调度,通常是由操作系统的线程调度器完成,在现代OS中,通常使用抢占式调度策略。而纤程的调用,完全依赖于程序员自己,即实现一种合作式调度,只有在主动提出切换时,才会进行切换。
多线程的程序很多不是为了提高效率,充分利用多 CPU,而是为了逻辑描述方便。
纤程往往可以提供更加便捷的描述,因为它只能通过 SwitchToFiber 显式切换,这样可以少许多加解锁的过程。而且切换的效率也比真正的线程来的高。
Fiber 就是一种 coroutine 的实现,而 coroutine 其实是一种常见的算法表达方式。只是 C 语言和其衍生的基于一个环境堆栈的语言并没有直接支持。所以才少为人知。
纤程用于化异步为同步。
你可以进行一个异步操作以后就切换纤程,等到异步操作完成以后在切换回来,这样,在逻辑上相关的代码就可以写到一个函数里面,而不用人为的分到多个回调函数中
fiber 的好处应该可以减轻锁的顾虑。在没有主动切换上下文之间,可以看成是原子操作。
要自己实现fiber,主要是保存线程上下文。注意要保存的信息有:各个寄存器,栈顶和栈底,异常信息,浮点寄存器。 window Fiber的默认堆栈是1M
0 0
- Windows下实现协程-Coroutine
- Linux下c实现协程-Coroutine
- 说说协程coroutine
- Unity如何在Editor下执行协程(coroutine)
- Unity如何在Editor下执行协程(coroutine)
- Unity3D之协程Coroutine
- unity3D之协程Coroutine
- lua coroutine协程初探
- python中的协程(coroutine)
- Coroutine实现有感
- coroutine实现注解
- Coroutine及其实现
- 我对协程coroutine的理解
- 关于Unity3D的协程(Coroutine)
- 关于Unity3D的协程(Coroutine)
- 明明白白lua的协程(coroutine)
- 关于Unity3D的协程(Coroutine)
- [Unity-22] Coroutine协程浅析
- C++之作用域运算符::
- 电脑护眼色设定
- 切换\"devenv\"命令关联的VS版本
- VS 注释选中行快捷键
- lua协程
- Windows下实现协程-Coroutine
- C++中得到基本数据类型的取值范围
- C/C++宏的特殊符号
- 初步使用std::vector
- 【转载】DirectX简史(转)
- 安装VS2010后,如何设置老版本的项目文件不是默认用VS2010打开
- \"S1023\" error when you install the DirectX SDK (June 2010)
- cocos2d-x学习笔记
- Cocos2d-x init() 和 onEnter() 区别