Partilhar via


Fibras

Um de fibra é uma unidade de execução que deve ser agendada manualmente pelo aplicativo. As fibras são executadas no contexto dos fios que as programam. Cada fio pode programar várias fibras. Em geral, as fibras não fornecem vantagens sobre uma aplicação multithreaded bem projetada. No entanto, o uso de fibras pode facilitar a portabilidade de aplicativos que foram projetados para agendar seus próprios threads.

Do ponto de vista do sistema, as operações realizadas por uma fibra são consideradas como tendo sido realizadas pelo thread que a executa. Por exemplo, se uma fibra acessa de armazenamento local de thread (TLS), ela está acessando o armazenamento local de thread do thread que está executando-o. Além disso, se uma fibra chamar a função ExitThread, o thread que está executando ela será encerrado. No entanto, uma fibra não tem todas as mesmas informações de estado associadas a ela como as associadas a um fio. A única informação de estado mantida para uma fibra é sua pilha, um subconjunto de seus registros, e os dados de fibra fornecidos durante a criação da fibra. Os registros salvos são o conjunto de registros normalmente preservados em uma chamada de função.

As fibras não são programadas preventivamente. Você agenda uma fibra mudando para ela de outra fibra. O sistema ainda agenda threads para serem executados. Quando uma rosca executando fibras é antecipada, sua fibra atualmente em execução é antecipada, mas permanece selecionada. A fibra selecionada é executada quando sua rosca é executada.

Antes de agendar a primeira fibra, chame a função ConvertThreadToFiber para criar uma área na qual salvar informações de estado da fibra. O thread de chamada é agora a fibra atualmente em execução. As informações de estado armazenadas para esta fibra inclui os dados de fibra passados como um argumento para ConvertThreadToFiber.

A função CreateFiber é usada para criar uma nova fibra a partir de uma fibra existente; A chamada requer o tamanho da pilha, o endereço inicial e os dados da fibra. O endereço inicial é normalmente uma função fornecida pelo usuário, chamada função de fibra, que usa um parâmetro (os dados da fibra) e não retorna um valor. Se sua função de fibra retornar, o fio que executa a fibra sai. Para executar qualquer fibra criada com CreateFiber, chame a funçãoSwitchToFibra. Você pode chamar SwitchToFiber com o endereço de uma fibra criada por um thread diferente. Para fazer isso, você deve ter o endereço retornado para o outro thread quando ele chamou CreateFiber e você deve usar a sincronização adequada.

Uma fibra pode recuperar os dados de fibra chamando o GetFiberData macro. Uma fibra pode recuperar o endereço da fibra a qualquer momento chamando o GetCurrentFiber macro.

Armazenamento local de fibra

Uma fibra pode usar de armazenamento local de fibra (FLS) para criar uma cópia exclusiva de uma variável para cada fibra. Se não ocorrer comutação de fibra, o FLS age exatamente da mesma forma que de armazenamento local de thread. As funções FLS (FlsAlloc, FlsFree, FlsGetValuee FlsSetValue) manipulam o FLS associado ao thread atual. Se a rosca estiver executando uma fibra e a fibra for comutada, o FLS também será comutado.

Para limpar os dados associados a uma fibra, chame o função de DeleteFibra. Esses dados incluem a pilha, um subconjunto dos registros e os dados de fibra. Se a fibra atualmente em execução chamar DeleteFiber, seu thread chamará ExitThread e termina. No entanto, se a fibra selecionada de um thread é excluída por uma fibra em execução em outro thread, o thread com a fibra excluída provavelmente terminará anormalmente porque a pilha de fibra foi liberada.

Usando fibras