Fibre

Una fibra è un'unità di esecuzione che deve essere programmata manualmente dall'applicazione. Le fibre vengono eseguite nel contesto dei thread che le pianificano. Ogni thread può pianificare più fibre. In generale, le fibre non offrono vantaggi rispetto a un'applicazione multithreading ben progettata. Tuttavia, l'uso di fibre può semplificare la conversione delle applicazioni progettate per pianificare i propri thread.

Dal punto di vista del sistema, le operazioni eseguite da una fibra vengono considerate eseguite dal thread che lo esegue. Ad esempio, se un fiber accede all'archiviazione locale del thread (TLS), accede all'archiviazione locale del thread che lo esegue. Inoltre, se una fibra chiama la funzione ExitThread , il thread che esegue viene chiuso. Tuttavia, una fibra non dispone di tutte le stesse informazioni sullo stato associate a esso come associato a un thread. L'unica informazione sullo stato mantenuta per una fibra è la sua pila, un subset dei suoi registri e i dati fiber forniti durante la creazione della fibra. I registri salvati sono in genere il set di registri conservati in una chiamata di funzione.

Le fibre non sono pianificate in modo preemptive. Si pianifica una fibra passando ad esso da un'altra fibra. Il sistema pianifica ancora l'esecuzione dei thread. Quando viene preempted un thread che esegue fibre, la fibra attualmente in esecuzione viene annullata ma rimane selezionata. La fibra selezionata viene eseguita quando viene eseguito il thread.

Prima di pianificare la prima fibra, chiamare la funzione ConvertThreadToFiber per creare un'area in cui salvare le informazioni sullo stato fiber. Il thread chiamante è ora la fibra attualmente in esecuzione. Le informazioni sullo stato archiviate per questa fibra includono i dati fiber passati come argomento per ConvertThreadToFiber.

La funzione CreateFiber viene usata per creare una nuova fibra da una fibra esistente; la chiamata richiede le dimensioni dello stack, l'indirizzo iniziale e i dati fiber. L'indirizzo iniziale è in genere una funzione fornita dall'utente, denominata funzione fiber, che accetta un parametro (i dati fiber) e non restituisce un valore. Se la funzione fiber viene restituita, il thread che esegue la fibra si chiude. Per eseguire qualsiasi fibra creata con CreateFiber, chiamare la funzione SwitchToFiber . È possibile chiamare SwitchToFiber con l'indirizzo di una fibra creata da un thread diverso. A tale scopo, è necessario che l'indirizzo venga restituito all'altro thread quando viene chiamato CreateFiber ed è necessario usare la sincronizzazione corretta.

Una fibra può recuperare i dati fiber chiamando la macro GetFiberData . Una fibra può recuperare l'indirizzo fiber in qualsiasi momento chiamando la macro GetCurrentFiber .

Archiviazione locale fiber

Una fibra può usare l'archiviazione locale fiber (FLS) per creare una copia univoca di una variabile per ogni fibra. Se non si verifica alcun cambio di fibra, FLS agisce esattamente come l'archiviazione locale del thread. Le funzioni FLS (FlsAlloc, FlsFree, FlsGetValue e FlsSetValue) modificano il fls associato al thread corrente. Se il thread esegue una fibra e la fibra viene commutata, anche il FLS viene commutato.

Per pulire i dati associati a una fibra, chiamare la funzione DeleteFiber . Questi dati includono lo stack, un subset dei registri e i dati fiber. Se l'oggetto fiber attualmente in esecuzione chiama DeleteFiber, il thread chiama ExitThread e termina. Tuttavia, se la fibra selezionata di un thread viene eliminata da una fibra in esecuzione in un altro thread, è probabile che il thread con la fibra eliminata termini in modo anomalo perché lo stack fiber è stato liberato.

Uso delle fibre