Compartilhar via


Fibras

Uma de fibra é uma unidade de execução que deve ser agendada manualmente pelo aplicativo. As fibras são executadas no contexto dos threads que os agendam. Cada thread pode agendar várias fibras. Em geral, as fibras não fornecem vantagens em relação a um aplicativo multithread bem projetado. 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 executadas por uma fibra são consideradas como sendo executadas pelo thread que o executa. Por exemplo, se uma fibra acessa TLS ( de armazenamento local de thread), ele está acessando o armazenamento local do thread que o está executando. Além disso, se uma fibra chamar a função ExitThread, o thread que a está executando sairá. No entanto, uma fibra não tem todas as mesmas informações de estado associadas a ela como as associadas a um thread. As únicas informações de estado mantidas para uma fibra são 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 agendadas preventivamente. Você agenda uma fibra mudando para ela de outra fibra. O sistema ainda agenda threads a serem executados. Quando um thread executando fibras é preemptado, sua fibra atualmente em execução é preemptada, mas permanece selecionada. A fibra selecionada é executada quando o thread é executado.

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

A função CreateFiber é usada para criar uma nova fibra de uma fibra existente; a chamada requer o tamanho da pilha, o endereço inicial e os dados de 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 de fibra) e não retorna um valor. Se a função de fibra retornar, o thread que executa a fibra sairá. Para executar qualquer fibra criada com CreateFiber, chame a funçãoSwitchToFiber. 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 a macroGetFiberData. Uma fibra pode recuperar o endereço de fibra a qualquer momento chamando a macro GetCurrentFiber.

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 nenhuma alternância de fibra ocorrer, o FLS agirá exatamente da mesma forma que de armazenamento local do thread. As funções FLS (FlsAlloc, FlsFree, FlsGetValuee FlsSetValue) manipulam o FLS associado ao thread atual. Se o thread estiver executando uma fibra e a fibra for alternada, o FLS também será alternado.

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

usando fibras