纤维

【勇芳软件工作室】汉化HomePreviousNext

A 【纤维】是执行单位,必须由应用程序手动调度。纤维在安排它们的线程的上下文中运行。每个线程可以安排多个光纤。一般来说,纤维不能比设计良好的多线程应用程序提供优势。然而,使用光纤可以更容易地端口用于安排自己的线程的应用程序。

从系统的角度来看,光纤采用创建它的线程的身份。例如,如果光纤访问线程本地存储(TLS),则它正在访问创建它的线程的线程本地存储。另外,如果光纤调用ExitThread函数,那么创建它的线程将退出。然而,光纤不具有与其相关联的与线程相关联的全部相同的状态信息。为光纤维护的唯一状态信息是其堆栈,其寄存器的子集以及在光纤创建期间提供的光纤数据。保存的寄存器是通常在函数调用中保存的一组寄存器。

纤维不是预先安排的。您可以通过从另一根光纤切换到光纤来安排光纤。系统仍然调度线程运行。当运行光纤的线程被抢占时,其当前运行的光纤被抢占。光纤在线程运行时运行。

在调度第一条光纤之前,调用ConvertThreadToFiber功能创建一个保存光纤状态信息的区域。调用线程现在是当前执行的光纤。该光纤的存储状态信息包括作为参数传递给ConvertThreadToFiber的光纤数据。

CreateFiber功能用于从现有光纤创建新光纤;呼叫需要堆栈大小,起始地址和光纤数据。起始地址通常是用户提供的功能,称为光纤功能,它采用一个参数(光纤数据),并且不返回值。如果光纤功能返回,则运行光纤的线退出。要执行使用CreateFiber,创建的任何光纤,请调用SwitchToFiber 功能。您可以使用不同线程创建的光纤的地址来调用SwitchToFiber.为此,您必须将该地址返回给另一个线程,当它调用CreateFiber,并且必须使用正确的同步。

光纤可以通过调用GetFiberData功能来检索光纤数据。光纤可以随时通过调用GetCurrentFiber 功能来检索光纤地址。

要清理与光纤相关联的数据,请调用DeleteFiber 功能。致电DeleteFiber时,您一定要小心。如果您为另一个线程创建的光纤调用DeleteFiber,则可能导致另一个线程异常终止。如果从当前正在运行的光纤调用DeleteFiber,其线程调用ExitThread.