打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
云风的 BLOG: 纤程

纤程

Widnows 是提供了用户级线程的,类似 coroutine 需要用户主动是切换。这在单线程程序中非常有用。线程调度模块只负责提供堆栈,环境的保存。不负责分配时间片等。

自己实现 coroutine 并不难,但能用操作系统提供的可以得到更多的便利。Windows 中把这种用户级线程叫做 Fiber,纤维的意思。比较通用的译名是纤程。

我们可以把一个 thread 转换成一个 fiber ,用到的 API 是 ConvertThreadToFiber。其实用的更多的是CreateFiber,它可以创建一个纤程,但并不切换过去运行。

被创建出来的 Fiber 会有一个上下文的地址被返回,用于以后的切换操作。我们可以用 SwitchToFiber 来切换。这是唯一用于 Fiber 释放操作权的途径。SwitchToFiber 必须显式的指定切换的目标,所以 Fiber 调度的工作需要我们自己写代码来实现。

GetCurrentFiber 和 GetFiberData 这两个函数都很有用,一个用来取到运行环境,一个用来取得创建参数,这两个函数都是用 inline 函数的形式提供在 .h 文件中的。

云风 提交于 October 14, 2005 02:35 PM | 固定链接

Comments

真是相当的惭愧啊!我现在才从这个篇日志和回复中了解到了windows上的Fiber和linux上的相对应的东西。 我曾经想过这个(叫做coroutinue)的东西来做RPC也许会有很多的好处,因为可以把异步转为同步,那么在RPC的时候就可以不用很多线程来操作了,一个coroutinue上的socket上的response有延迟的话不会影响到其他的coroutinue,因为这个时候cpu的所有权已经被转移到了其他的coroutinue上。而更加重要的是,写代码的时候就不需要为了提高throughput而是用callback(这个真的很痛苦)可特别是需要很多callback的时候 ...
哎,知之晚矣,不过总比不知道的好。

Posted by: suds | (17) June 21, 2012 02:30 PM

fiber 的好处应该可以减轻锁的顾虑。在没有主动切换上下文之间,可以看成是原子操作。

此外,跟线程差不太多。

btw, 我现在比较倾向于用多进程方案。

Posted by: Cloud

| (16) April 8, 2009 08:54 PM

请教一个问题:
我想在一个应用程序中用fiber,以便化异步为同步,以进行一个异步操作以后就切换纤程,等到异步操作完成以后在切换回来。
这样使用后逻辑清晰,但是windows核心编程中或者其他资料中对fiber的使用介绍不是很多,好多地方不能深入理解,现在有几个问题请教一下:
1:如果不用fiber,而用多线程可以达到fiber的效果么?
我的模型是:1个工作线程,1个ui线程,1个共享事件队列。其中工作线程用户获取共享事件队列中的事件并且处理,ui线程处理windows消息并且包装成事件,送入共享事件队列。
要达到:工作线程处理一个事件进行运算过程中,ui线程要阻塞。工作线程计算完毕等待下一个事件时,ui线程可以往共享事件队列里面塞入数据。

1.1 一种方案是我设置inputevent和waitevent表示现在系统的状态,然后用SetEvent和WaitForSingleObject,但是这样很啰嗦,并且不小心还有死锁的现象,更主要的是用了内核对象,性能有明显的影响。比如在有些有些配置很高的机器上鼠标移动有滞后现象。(在相同的计算量下,用fiber几乎没有该现象。)

1.2 还有一种方案是启动2个线程,然后根据具体情况,一个线程总是唤醒另外一个线程,然后自己挂起。这样就达到fiber的手动切换的效果了。

不知道以上2个方案是否可行。

2:如果系统用windows的fiber来实现。那么fiber和多线程是否可以混合共存?
比如我的worker fiber中某个函数自己故意启动了好多多线程,这样是否会混乱?

万分感谢。

Posted by: xiaol | (15) April 8, 2009 09:40 AM

尽量避免使用fiber。。每个fiber都有自己的callstack,在visual studio中,你可以看到当前进程中每个线程的callstack,但你无法看到每个fiber的callstack,这会给调试带来极大的困难。当程序逻辑变得复杂之后,fiber起的作用就是让逻辑更混乱。。
我们公司一个软件90年代从DOS升级到MFC MDI的时候,既希望尽量复用原有代码(原有代码是基于单线程设计的,没有考虑到访问冲突等),又需要一些多线程的特点,所以使用了fiber。
现在想把fiber去掉,可是没人能做得掉它。。

Posted by: chen | (14) November 13, 2008 04:09 PM

关注 Fiber , 看起来确实是个优秀的东西!

Posted by: yongzhi.wu | (13) October 18, 2007 10:23 AM

自己实现fiber也是可以的,但是想做完美很痛苦。
主要的担心是windows的TEB之类的结构可能会变,要考虑不少兼容性问题。如果不处理异常那就方便多了。

Posted by: Anonymous | (12) May 14, 2007 10:24 PM

貌似线程至少要占用 8k 地址空间才是安全的。4k 是最小的页单位,还要空留 4k 做越界异常。

fiber 我没开过那么多,如果有这种需求,我会用自己的库,更为节省且容易控制。

Posted by: Cloud

| (11) May 14, 2007 01:17 PM

我试的栈是4K。。。1K也试过

Posted by: Anonymous | (10) May 14, 2007 09:39 AM

Fiber的默认堆栈是1M,在32位机上,地址空间很快就会用完的。把堆栈设少一点就行了

Posted by: Atry | (9) May 13, 2007 07:52 PM

我认为fiber的用处还是很大的。可以用来很方便的描述逻辑。
但是c语言有先天性不足,很难实现100k级别的fiber同时运行。
要自己实现fiber,主要是保存线程上下文。注意要保存的信息有:各个寄存器,栈顶和栈底,异常信息,浮点寄存器。
windows自己实现的fiber切换都在用户态完成,速度还是比较快的。但是好像在我的机器上只能开2k左右个fiber,我的系统是win2k3 sp2,不知道是不是系统的问题。

Posted by: Anonymous | (8) May 12, 2007 09:43 PM

POSIX的等价物是setcontext, getcontext, makecontext and swapcontext

Posted by: Anonymous | (7) February 9, 2007 11:11 AM

云风把Fiber讲得很透彻啊.侯捷说纤程开始是微软便于用户把Unix程序port到windows中来的,然而Fiber作为coroutine的一个实现,在通讯中更好发挥作用.

几个月前偶尔逛书店看到云风的书,写得不错啊.牛人啊.

Posted by: Fang Yidong | (6) July 25, 2006 04:30 PM

纤程用于化异步为同步。
你可以进行一个异步操作以后就切换纤程,等到异步操作完成以后在切换回来,这样,在逻辑上相关的代码就可以写到一个函数里面,而不用人为的分到多个回调函数中。

Posted by: Atry | (5) December 5, 2005 06:44 PM

SQL Server就用到fiber的。

有没有用vs2003或者vs2005去调试过fiber呢?

Posted by: madlax | (4) November 15, 2005 10:35 PM

纤程在一些特定场合非常有用。
linux有纤程么?

Posted by: lhb | (3) November 2, 2005 07:26 PM

多线程的程序很多不是为了提高效率,充分利用多 CPU,而是为了逻辑描述方便。

纤程往往可以提供更加便捷的描述,因为它只能通过 SwitchToFiber 显式切换,这样可以少许多加解锁的过程。而且切换的效率也比真正的线程来的高。

Fiber 就是一种 coroutine 的实现,而 coroutine 其实是一种常见的算法表达方式。只是 C 语言和其衍生的基于一个环境堆栈的语言并没有直接支持。所以才少为人知。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
并发危险:解决多线程代码中的 11 个常见的问题
Coroutine in Depth
高级VFP服务(三)
外派去微软MS面试的一些东西
多线程的优劣/性能/系统开销_龙宜坡
NT 内核的进程调度分析笔记
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服