C12、纤程

来源:互联网 发布:网络挂机 编辑:程序博客网 时间:2024/05/17 01:01

目的:方便将UNIX服务器程序移植到Windows中(以转换UNIX多线程为Windows多线程,因为他们使用不同的算法结构),Windows程序应该避免使用纤程。纤程以用户(非内核)方式代码实现。

 

一、将现有的线程转换为纤程:

PVOID ConvertThreadToFiber(PVOID pvParam);

该函数为纤程的执行环境分配内存(200 byte),(并初始化)其组成:

n         用户定义值:pvParam

n         结构化异常处理链的头;

n         纤程内存栈的最高、最低地址

n         CPU寄存器。

返回纤程的执行环境的内存地址

二、在该线程(已成为纤程)创建其他纤程:

PVOID CreateFiber(      // 将创建新内存栈,分配执行环境结构,初始化

                  DWORD dwStackSize,       // 内存栈大小,常 = 0

                  PFIBER_START_ROUTINE pfnStartAddress, // 纤程函数(你的函数)

                  PVOID pvParam);  // 用户定义值

   返回纤程的执行环境的内存地址

三、纤程函数原型:

VOID WINAPI FiberFunc(PVOID pvParam)// CreateFiberpvParam

四、运行新纤程(纤程获得CPU时间的唯一方法):

VOID SwitchToFiber(PVOID pvFiberExecutionContext); // pvFiberExecutionContext = CreateFiber ConvertThreadToFiber返回的地址。

五、撤销纤程:

VOID DeleteFiberPVOID pvFiberExecutionContext; // 参数同上

如果传递了当前与线程相关联的纤程地址,则该线程与其创建的所有纤程被撤销

六、获得当前运行的纤程的执行环境的地址(内蕴函数 infrinsic function,运行快):

PVOID GetCurrentFiber();      

PVOID GetFiberData(); // 前叙pvParam