Windows纤程(Fiber)
Jan 6, 2014
进程可以包含多个线程,线程又可以划分成多个纤程(Fiber)。
线程是内核对象,由Windows系统自动调度,线程的状态和数据需要内核进程创建和维护。
纤程是Windows提供的用户级线程包,完全运行在用户空间中,即对Windows内核是透明的。纤程由用户手动调度。
纤程的作用和优点: #
- 使得UNIX服务器应用程序更好地移植到Windows中;
- 运行在用户空间中,切换快,资源消耗少;
- 用户可以手动调度。
纤程的主要目的是为开发人员调用多个不需要并行执行的任务提供一个便捷的机制。 纤程对程序的并行执行并没有帮助,仅为开发人员手动调度多个任务提供方便 多核程序设计技术-通过软件多线程提升性能
纤程的使用方法 #
- 首先使用ConvertThreadToFiber() 将当前线程转换为纤程
- 使用CreateFiber() 创建新的纤程,并指定回调函数(纤程函数);纤程函数返回类型为void
- 使用SwitchToFiber() 切换到某个纤程
- 使用DeleteFiber() 删除一个纤程
- 可以使用GetCurrentFiber() 返回当前运行的纤程的地址
线程中,任意时刻只能运行一个纤程。
下面是一个纤程的示例代码
//通知编译器引入Windows NT4.0及其以后版本中的windows.h的特性
#define _WIN32_WINNT 0x400
#include <stdio.h>
#include <windows.h>
#define FIBER_COUNT 5 //纤程数量
LPVOID fiberAddr[FIBER_COUNT]; //纤程地址
VOID WINAPI fiberProc(void* param);//纤程(回调)函数
int main()
{
fiberAddr[0] = ConvertThreadToFiber(NULL);//线程转化为纤程,返回纤程地址
int i=0;
for(i=1;i<FIBER_COUNT;i++)
{
//创建纤程
fiberAddr[i] = CreateFiber( 0, //dwStackSize,栈大小
fiberProc, //lpStartAddress,纤程函数
&i //lpParameter,参数
);
if(fiberAddr[i] != NULL)
{
printf("Fiber %d Created!\n",i);
}
}
for(i=1;i<FIBER_COUNT;i++)
{
if(fiberAddr[i] != NULL)
{
SwitchToFiber(fiberAddr[i]); //切换纤程
}
}
return 0;
}
VOID WINAPI fiberProc(void * param)
{
int id = *((int *)param);
printf("Fiber %d is running...\n",id);
//切换回主纤程
SwitchToFiber(fiberAddr[0]);
}