13.纤程(Fiber)与协程(Coroutine)

13.1 纤程

纤程(Fiber)是 Windows 操作系统提供的概念。什么是纤程呢?

当我们需要异步执行一些任务时,常用的一种做法就是开启一个工作线程,在工作线程中执行我们的任务。但是这样存在两个问题:

  • 由于线程的调度是操作系统内核控制的,我们没法准确地确定操作系统何时会运行或挂起该线程;

  • 对于一些轻量级的任务,创建一个新的线程去做,消耗比较大,我们不希望有这种消耗。

那么有没有一种机制,既能起到新建线程执行任务,又没有新建线程消耗那么大呢?有,这就是纤程。

在 Windows 中一个线程中可以有多个纤程,用户可以根据需要自由在各个纤程之间切换。如果要在某个线程中使用纤程,必须先将该线程切换成纤程模式,可以调用如下 API 函数:

LPVOID ConvertThreadToFiber(LPVOID lpParameter);

这个函数不仅将当前线程切换成纤程模式,同时也得到线程中第一个纤程,我们可以通过这个函数的返回值来引用和操作纤程,这个纤程是线程中的“主纤程”,但是这个“主纤程”由于没法指定“纤程”函数,所以什么也做不了。可以通过参数 lpParameter 给主纤程传递数据,获取当前纤程的数据使用 API 函数:

PVOID GetFiberData();

当在不同纤程之间切换时,也会涉及到纤程上下文的切换,包括 CPU 寄存器数据的切换,在默认情况下,x86 系统的 CPU 浮点状态信息不属于 CPU 寄存器的一部分,不会为每个纤程都维护一份,因此如果读者的纤程中需要执行浮点操作,将会导致数据被破坏。为了禁用这种行为,我们需要 ConvertThreadToFiberEx 函数,该函数签名如下:

LPVOID ConvertThreadToFiberEx(LPVOID lpParameter, DWORD dwFlags);

将第二个参数 dwFlags 设置为 FIBER_FLAG_FLOAT_SWITCH 即可。

将线程从纤程模式切回至默认的线程模式,使用 API 函数:

BOOL ConvertFiberToThread();

上文我们说了默认的主纤程什么都做不了,所以我们在需要的时候要创建新的纤程,使用 API 函数:

LPVOID CreateFiber(SIZE_T                dwStackSize,
           LPFIBER_START_R
  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值