Windows核心编程<读书笔记十二>纤程

纤程

【文起】跟蟹儿在一起了,一直处于兴奋、幸福状态,爱蟹儿

为了将Unix服务器应用程序移植到windows中,Windows有了纤程。纤程是以用户方式代码来实现的,内核并不知道纤程,且它们是根据用户定义的算法来调度的,所以纤程不是抢占式的调度。

使用纤程时,第一步是将现有的线程转化为一个纤程。函数ConvertThreadToFiber

PVOID  ConverThreadToFiber(PVOID  pvParam);

该函数为纤程的执行环境分配相应的内存(约200字节),该执行环境由下列元素组成:

l  一个用户定义的值, pvParam

l  结构化异常处理链的头

l  纤程内存栈的最高和最低地址

l  CPU寄存器,包括堆栈指针、指令指针和其他

该函数返回纤程执行环境的内存地址,执行之后纤程就会运行。如果纤程(线程)返回或者调用ExitThread函数,那么纤程和线程都会终止运行。

         除非打算创建更多纤程以便在同一个线程上运行,否则没有理由将线程转换为纤程。

可以创建另一个纤程,该线程函数可以调用CreateFiber函数

PVOID  CreateFiber(DWORD  dwStackSize, PFIBER_START_ROUTINE pfnStartAddress,

PVOID  pvParam);

其中 pfnStartAddress参数用于设定必须实现的纤程例程的地址,必须采用下面的原型:
VOID WINAPI  FiberFunc(PVOID  pvParam);

纤程初次被调度时,该函数就看是运行,且将传递给CreateFiber的pvParam值传递给它。与ConverThreadToFiber 不同的是,CreateFiber创建的新纤程并不执行,因为当前运行的纤程仍然在执行,而单个线程上每次只能运行一个纤程。如果要使新纤程能够运行,可以调用SwitchToFiber函数

VOID  SwitchToFiber(PVOID  pvFiberExecutionContext);

pvFiberExecutionContext 是调用ConverThreadToFiber 或者 CreateFiber 函数返回的内存地址,其目的是告诉该函数,对哪个纤程进行调度。

该函数是纤程获得CPU时间的唯一途径。同样若要撤销纤程,可以调用DeleteFiber
一个线程每次只可以执行一个纤程,所以操作系统始终知道当前哪个纤程与该线程相关。

         可以通过调用GetCurrentFiber函数或者GetFiberData函数来获取

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值