Fibras

Uma 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 sobre 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 executadas pelo thread que a executa. Por exemplo, se uma fibra acessa o TLS ( 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 será encerrado. 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 para essa 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ção SwitchToFiber . 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 chamar CreateFiber e você deve usar a sincronização adequada.

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

Armazenamento Local de Fibra

Uma fibra pode usar o FLS ( armazenamento local de fibra ) para criar uma cópia exclusiva de uma variável para cada fibra. Se nenhuma troca de fibra ocorrer, o FLS atuará exatamente da mesma forma que o armazenamento local do thread. As funções FLS (FlsAlloc, FlsFree, FlsGetValue e 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 limpo 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 a fibra em execução chamar DeleteFiber no momento, 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á anormalmente porque a pilha de fibras foi liberada.

Usando fibras