纤程

纤程的构造类似线程,在应用程序内被调度,而不是被调度器调度。纤程和线程类似,有自己的栈和上下文。不同的是应用程序自己管理纤程,手动的在纤程之间切换,这样每个纤程都在应用程序的安排获得合适的执行时间。

 

一个应用程序在创建纤程时,首先创建一个线程。这个线程调用一个函数将自己转换成一个纤程后。这个线程,在成为纤程后,可以从自身创建多个纤程。

操作系统将所有的纤程作为一个线程来调度--该线程就是原来转换成第一个纤程的线程。所以系统对应用程序中原来那个线程分配调度时间,应用程序将这段时间分配给他选择的纤程。所以,当应用程序选择时,它可以停止某个纤程,调度另一个。

 

要创建纤程,应用程序应首先创建一个线程。这个线程调用ConvertThreadToFiber()函数。该函数唯一参数就是应用程序定义的值,可以被纤程使用GetFiberData宏接收。

一个显著的限制就是将一个线程转换成纤程,线程必须使用主线程的默认栈大小

如果这个纤程使用了和进程主线程不同的栈大小,调用ConvertThreadToFiber函数会失败。

在原来的线程转换为纤程之后,它可以创建附加纤程。调用函数:CreateFiber();其返回值为指向这个纤程的纤程数据的指针。这个值将被另一个希望调度这个纤程的纤程使用。

纤程的入口点函数原型VOID CALLBACK FiberProc(PVOID lpParameter)

lpParameter是从CreateFiber传过来的参数,可以通过调用GetFiberData取得。注意纤程过程没有返回值。一个纤程过程应该永远不会返回。如果纤程返回,系统将退出作为所有纤程基础的线程。

新建的纤程不是立刻执行的。相反的,调用CreateFiber函数的纤程必须显式调用下面的函数以切换到新的纤程上。VOID SwitchToFiber(LPVOID lpFiber);该函数的唯一参数是指向将要切换到的纤程的纤程数据的指针。当这个调用发生时,调用该函数的纤程被挂起,新的纤程开始运行。

VOID DeleteFiber(LPVOID lpFiber);用来销毁一个纤程。如果一个纤程对自身调用deleteFiber函数,该线程就会退出,和线程相关的所有纤程都会终止。

纤程终止时的清理工作很重要。每个纤程应该被另外一个纤程删除,直到最后一个纤程,它将删除自身并退出线程。如果线程退出时没有删除所有的纤程,提交给每个未删除的纤程使用的内存不会释放,将导致应用程序内存泄露。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值