纖維

Fiber是應用程式必須手動排程的執行單位。 Fiber 會在排程它們的執行緒內容中執行。 每個執行緒都可以排程多個光纖。 一般而言,光纖不會提供優於設計完善的多執行緒應用程式的優點。 不過,使用 Fiber 可讓您更輕鬆地移植設計來排程自己的執行緒的應用程式。

從系統的觀點來看,光纖所執行的作業會被視為由執行它的執行緒所執行。 例如,如果 Fiber 存取 執行緒本機儲存體 (TLS) ,它會存取執行它的執行緒執行緒本機儲存體。 此外,如果 Fiber 呼叫 ExitThread 函式,則會結束執行它的執行緒。 不過,Fiber 與執行緒相關聯的狀態資訊並沒有與它相關聯的所有相同狀態資訊。 針對光纖維護的唯一狀態資訊是其堆疊、其暫存器子集,以及光纖建立期間提供的光纖資料。 儲存的暫存器是通常會跨函式呼叫保留的暫存器集合。

光纖不會預先排程。 您可以從另一個光纖切換至光纖來排程光纖。 系統仍會排程要執行的執行緒。 當執行 Fiber 的執行緒被先占時,其目前正在執行的 Fiber 會先占,但仍會保持選取狀態。 選取的 Fiber 會線上程執行時執行。

排程第一個光纖之前,請先呼叫 ConvertThreadToFiber 函式,以建立用來儲存 Fiber 狀態資訊的區域。 呼叫執行緒現在是目前正在執行的 Fiber。 此光纖的預存狀態資訊包含傳遞為 ConvertThreadToFiber引數的 Fiber 資料。

CreateFiber函式可用來從現有的光纖建立新的光纖;呼叫需要堆疊大小、起始位址和光纖資料。 起始位址通常是使用者提供的函式,稱為 fiber 函式,它會 (光纖) 資料 (一個參數,而且不會傳回值。 如果您的 Fiber 函式傳回,執行 Fiber 的執行緒就會結束。 若要執行使用 CreateFiber建立的任何光纖,請呼叫 SwitchToFiber 函式。 您可以使用不同執行緒所建立的 Fiber 位址來呼叫 SwitchToFiber 。 若要這樣做,您必須在呼叫 CreateFiber 時將位址傳回給其他執行緒,而且必須使用適當的同步處理。

Fiber 可以藉由呼叫 GetFiberData 宏來擷取 Fiber 資料。 光纖可以隨時呼叫 GetCurrentFiber 宏來擷取 Fiber 位址。

Fiber 本機儲存體

光纖可以使用 光纖本機儲存體 (FLS) ,為每個光纖建立變數的唯一複本。 如果沒有發生光纖切換,FLS 的作用與 執行緒本機儲存體完全相同。 FLS 函式 (FlsAlloc、FlsFreeFlsGetValue 和 FlsSetValue) 操作與目前線程相關聯的 FLS。 如果執行緒正在執行 Fiber 並切換光纖,則 FLS 也會切換。

若要清除與 Fiber 相關聯的資料,請呼叫 DeleteFiber 函式。 此資料包括堆疊、暫存器子集,以及光纖資料。 如果目前正在執行的 Fiber 呼叫 DeleteFiber,其執行緒會呼叫 ExitThread 並終止。 不過,如果在另一個執行緒中執行的 Fiber 會刪除線程的選取光纖,則具有已刪除光纖的執行緒可能會因為已釋放光纖堆疊而異常終止。

使用 Fibers