Fibre
Un fiber è un'unità di esecuzione che deve essere pianificata manualmente dall'applicazione. Le fibre vengono eseguite nel contesto dei thread che li 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 una fibra accede 'archiviazione locale 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 registri e i dati fiber forniti durante la creazione della fibra. I registri salvati sono in genere il set di registri mantenuti in una chiamata di funzione.
Le fibre non sono pianificate in modo preemptive. Si pianifica una fibra passando a esso da un'altra fibra. Il sistema pianifica ancora l'esecuzione dei thread. Quando viene superato 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 della fibra. Il thread chiamante è ora la fibra attualmente in esecuzione. Le informazioni sullo stato archiviato per questa fibra includono i dati fiber passati come argomento per ConvertThreadToFiber.
La funzioneCreateFiberviene 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 viene chiuso. Per eseguire qualsiasi fibra creata con CreateFiber, chiamare la funzioneSwitchToFiber. È 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 macroGetFiberData. Una fibra può recuperare l'indirizzo fiber in qualsiasi momento chiamando la macro GetCurrentFiber.
Archiviazione locale fiber
Una fibra può usare 'archiviazione locale fiber (FLS) per creare una copia univoca di una variabile per ogni fibra. Se non si verifica alcun cambio in fibra, FLS agisce esattamente come 'archiviazione locale del thread. Le funzioni FLS (FlsAlloc, FlsFree, FlsGetValuee FlsSetValue) modificano il file 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 funzionedeleteFiber. 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 di fibre è stato liberato.
Argomenti correlati