Compartir a través de


Fibras

Una fibra es una unidad de ejecución que la aplicación debe programar manualmente. Las fibras se ejecutan en el contexto de los subprocesos que los programan. Cada subproceso puede programar varias fibras. En general, las fibras no proporcionan ventajas sobre una aplicación multiproceso bien diseñada. Sin embargo, el uso de fibras puede facilitar la portabilidad de aplicaciones diseñadas para programar sus propios subprocesos.

Desde el punto de vista del sistema, las operaciones realizadas por una fibra se consideran realizadas por el subproceso que la ejecuta. Por ejemplo, si una fibra accede al almacenamiento local del subproceso (TLS), accede al almacenamiento local del subproceso del subproceso que lo ejecuta. Además, si una fibra llama a la función ExitThread , se cierra el subproceso que ejecuta. Sin embargo, una fibra no tiene la misma información de estado asociada a ella que la asociada a un subproceso. La única información de estado mantenida para una fibra es su pila, un subconjunto de sus registros y los datos de fibra proporcionados durante la creación de fibra. Los registros guardados son el conjunto de registros que normalmente se conservan en una llamada de función.

Las fibras no están programadas de forma preventiva. Programe una fibra cambiando a ella desde otra fibra. El sistema sigue programando subprocesos para ejecutarse. Cuando se adelanta un subproceso que ejecuta fibras, su fibra actualmente en ejecución se adelanta pero permanece seleccionada. La fibra seleccionada se ejecuta cuando se ejecuta su subproceso.

Antes de programar la primera fibra, llame a la función ConvertThreadToFiber para crear un área en la que se guarde información de estado de fibra. El subproceso que realiza la llamada es ahora la fibra que se está ejecutando actualmente. La información de estado almacenada de esta fibra incluye los datos de fibra pasados como argumento a ConvertThreadToFiber.

La función CreateFiber se usa para crear una nueva fibra a partir de una fibra existente; la llamada requiere el tamaño de la pila, la dirección inicial y los datos de fibra. La dirección inicial suele ser una función proporcionada por el usuario, denominada función de fibra, que toma un parámetro (los datos de fibra) y no devuelve un valor. Si la función de fibra vuelve, el subproceso que ejecuta las salidas de fibra. Para ejecutar cualquier fibra creada con CreateFiber, llame a la función SwitchToFiber . Puede llamar a SwitchToFiber con la dirección de una fibra creada por un subproceso diferente. Para ello, debe tener la dirección devuelta al otro subproceso cuando llamó a CreateFiber y debe usar la sincronización adecuada.

Una fibra puede recuperar los datos de fibra llamando a la macro GetFiberData . Una fibra puede recuperar la dirección de fibra en cualquier momento llamando a la macro GetCurrentFiber .

Almacenamiento local de fibra

Una fibra puede usar el almacenamiento local de fibra (FLS) para crear una copia única de una variable para cada fibra. Si no se produce ningún cambio de fibra, FLS actúa exactamente igual que el almacenamiento local de subprocesos. Las funciones FLS (FlsAlloc, FlsFree, FlsGetValue y FlsSetValue) manipulan el FLS asociado al subproceso actual. Si el subproceso está ejecutando una fibra y la fibra se cambia, el FLS también se cambia.

Para limpiar los datos asociados a una fibra, llame a la función DeleteFiber . Estos datos incluyen la pila, un subconjunto de los registros y los datos de fibra. Si la fibra actualmente en ejecución llama a DeleteFiber, su subproceso llama a ExitThread y finaliza. Sin embargo, si la fibra seleccionada de un subproceso se elimina mediante una fibra que se ejecuta en otro subproceso, es probable que el subproceso con la fibra eliminada finalice anómalamente porque la pila de fibra se ha liberado.

Uso de fibras