纖維
fiber 是應用程式必須手動排程的執行單位。 Fiber 會在排程它們的線程內容中執行。 每個線程都可以排程多個光纖。 一般而言,光纖不會比設計完善的多線程應用程式提供優勢。 不過,使用 Fiber 可讓您更輕鬆地移植設計來排程自己的線程的應用程式。
從系統的觀點來看,光纖所執行的作業會被視為由執行光纖的線程執行。 例如,如果光纖存取線程本機記憶體 (TLS),則會存取執行它的線程線程本機記憶體。 此外,如果 fiber 呼叫 ExitThread 函式,則會結束執行它的線程。 不過,Fiber 沒有與線程相關聯的所有相同狀態資訊。 為光纖維護的唯一狀態資訊是其堆疊、其緩存器子集,以及光纖建立期間所提供的光纖數據。 儲存的快取器是一組通常保留在函數調用中的緩存器。
光纖並非預先排程。 您可以透過從另一個光纖切換至光纖來排程光纖。 系統仍會排程要執行的線程。 當執行光纖的線程被搶佔時,其目前執行的光纖會先佔,但仍會保持選取狀態。 選取的光纖會在線程執行時執行。
排程第一個光纖之前,請先呼叫 convertThreadToFiber函式,以建立儲存光纖狀態信息的區域。 呼叫線程現在是目前正在執行的 Fiber。 此光纖的預存狀態資訊包含傳遞為自變數的 fiber 資料,ConvertThreadToFiber。
CreateFiber 函式可用來從現有的光纖建立新的光纖:呼叫需要堆疊大小、起始位址和光纖數據。 起始位址通常是使用者提供的函式,稱為 fiber 函式,採用一個參數(Fiber 數據),而且不會傳回值。 如果您的 Fiber 函式傳回,則執行 Fiber 的線程會結束。 若要執行使用 createFiber 建立的任何光纖,請呼叫 SwitchToFiber 函式。 您可以使用不同線程所建立的光纖位址呼叫 SwitchToFiber。 若要這樣做,您必須在呼叫 CreateFiber 時,將位址傳回給另一個線程,而且您必須使用適當的同步處理。
fiber 可以藉由呼叫 getFiberData巨集來擷取光纖數據。 Fiber 可以隨時呼叫 getCurrentFiber巨集來擷取光纖位址。
Fiber 本機記憶體
光纖可以使用 光纖本機記憶體 (FLS) 為每個光纖建立變數的唯一復本。 如果沒有發生光纖切換,FLS 的行為與 線程本機記憶體完全相同。 FLS 函式(FlsAlloc、FlsFree、FlsGetValue和 FlsSetValue)會作與目前線程相關聯的 FLS。 如果線程執行光纖且光纖已切換,則也會切換 FLS。
若要清除與光纖相關聯的數據,請呼叫 DeleteFiber 函式。 此數據報括堆疊、緩存器子集和光纖數據。 如果目前執行中的 fiber 呼叫 DeleteFiber,其線程會呼叫 exitThread並終止。 不過,如果線程選取的光纖是由在另一個線程中執行的光纖刪除,則具有已刪除光纖的線程可能會因為光纖堆疊已釋放而異常終止。
相關主題