纤程
在计算机科学中,纤程(英语:Fiber)是一种最轻量化的线程(lightweight threads)。它是一种用户态线程(user thread),让应用程序可以独立决定自己的线程要如何运作。操作系统内核不能看见它,也不会为它进行调度。
就像一般的线程,纤程有自己的寻址空间。但是纤程采取合作式多工(Cooperative multitasking),而线程采取先占式多工(Pre-emptive multitasking)。应用程序可以在一个线程环境中建立多个纤程,然后手动执行它。纤程不会被自动执行,必须要由应用程序自己指定让它执行,或换到下一个纤程。
跟线程相比,纤程较不需要操作系统的支持。
Windows纤程
编辑一个用户态线程拆分成多个纤程,通过用户态代码来调度纤程,从而让各个纤程“非抢占”地工作。相关Windows API:
- PVOID ConvertThreadToFiber(PVOID pvParam); //把当前线程转换为纤程,系统为纤程执行环境分配大概200字节的存储空间,包括:1、由参数pvParam参数指定的用户定义的值,2、结构化异常处理链头。3、纤程的运行栈的最高和最低地址。4、各种CPU寄存器信息。
- PVOID ConvertThreadToFiberEx(PVOID pvParam,DWORD dwFlags);//默认情况下,x86系统的CPU的浮点数状态信息在纤程看来不属于CPU寄存器,因此会导致在纤程中执行一些相关的浮点运算会破坏数据。为了克服这一问题,调用本函数并且传递FIBER_FLAG_FLOAT_SWITCH给它的第2个参数dwFlags
- PVOID CreateFiber(DWORD dwStackSize,PFIBER_START_ROUTINE pfnStartAddress,PVOID pvParam); // 在同一个线程中再创建一个纤程
- PVOID CreateFiberEx(SIZE_T dwStackCommitSize,SIZE_T dwStackReserveSize,DWORD dwFlags, PFIBER_START_ROUTINE pStartAddress, PVOID pvParam); // 一个线程包含多个纤程
- VOID WINAPI FiberFunc(PVOID pvParam);//纤程函数的规格
- VOID SwitchToFiber(PVOID pvFiberExecutionContext);//调度纤程的执行。参数是ConverThreadToFiber(Ex)或CreateFiber(Ex)返回值。
- VOID DeleteFiber(PVOID pvFiberExecutionContext);//纤程完成了任务,删除它. 该函数首先清除纤程运行栈,然后删除纤程执行环境。一般是由一个纤程调用来删除另一个纤程。
- ConvertFiberToThread //当所有纤程结束了运行,需要从纤程转换为线程
- IsThreadAFiber //是否正在一个纤程执行环境中运行
- PVOID GetCurrentFiber();// 正在执行的纤程的执行环境
- PVOID GetFiberData();//用户定义的一个数据,这个数据由CreateFiber(Ex)或ConvertThreadToFiber(Ex)的pvParam参数指定
- 纤程局部存储(FLS)机制。这个机制和“线程局部存储”(TLS)类似
- FlsAlloc函数分配FLS槽来存放数据,这个FLS槽可以被当前进程内所有纤程共同使用
- FlsSetValue函数来保存数据到FLS槽中
- FlsGetValue函数来获取FLS槽中对应的数据
- FlsFree来释放FLS槽