纤程(Fibers)简单使用易语言源码光纤是应用程序必须手动计划的执行单元。 光纤在计划它们的线程上下文中运行。 每个线程可以计划多个光纤。 通常,光纤在设计良好的多线程应用程序上不提供优势。 但是,使用光纤可以更轻松地移植旨在计划其自己的线程的应用程序。

从系统的角度来看,光纤执行的操作被认为是由运行它的线程执行的。 例如,如果光纤访问 线程本地存储 (TLS) ,则它正在访问运行它的线程的线程本地存储。 此外,如果光纤调用 ExitThread 函数,则运行它的线程将退出。 但是,光纤与与线程关联的状态信息并不相同。 为光纤维护的唯一状态信息是其堆栈、其寄存器的子集,以及在创建光纤期间提供的光纤数据。 保存的寄存器是通常在函数调用中保留的寄存器集。

纤维不是预先安排的。 可以通过从另一个光纤切换到光纤来计划光纤。 系统仍计划线程运行。 当线程运行光纤被抢占时,其当前运行的光纤被抢占,但仍处于选中状态。 所选光纤在线程运行时运行。

在计划第一个光纤之前,请调用 ConvertThreadToFiber 函数来创建一个用于保存光纤状态信息的区域。 调用线程现在是当前正在执行的光纤。 此光纤的存储状态信息包括作为 参数传递给 ConvertThreadToFiber 的光纤数据。

CreateFiber 函数用于从现有光纤创建新的光纤;调用需要堆栈大小、起始地址和光纤数据。 起始地址通常是用户提供的函数,称为光纤函数,该函数采用一个参数 (光纤数据) 且不返回值。 如果光纤函数返回,则运行光纤的线程将退出。 若要执行使用 CreateFiber 创建的任何光纤,请调用 SwitchToFiber 函数。 可以使用其他线程创建的光纤的地址调用 SwitchToFiber 。 为此,必须在名为 CreateFiber 时将地址返回到其他线程,并且必须使用正确的同步。

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

发表回复

后才能评论