計算機科學中,纖程(英語: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槽

參見