纤程
【文起】跟蟹儿在一起了,一直处于兴奋、幸福状态,爱蟹儿
为了将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函数来获取