Comprensione dei pool di thread in C #

Un thread è la più piccola unità di esecuzione all'interno di un processo. Un pool di thread comprende un numero di thread o una raccolta di thread per essere precisi e può essere utilizzato per eseguire diverse attività in background.

Perché dovrei usare i pool di thread?

I thread sono costosi in quanto consumano molte risorse nel sistema per l'inizializzazione, il cambio di contesto e il rilascio delle risorse che occupano. Normalmente, quando un thread esegue un'operazione di I / O (gestione di file, operazione di database o accesso alle risorse di rete, ecc.), Il thread viene bloccato dal sistema operativo fino al completamento dell'operazione di I / O. Il thread riprenderà il funzionamento della CPU al termine dell'operazione di I / O.

Un pool di thread è una buona scelta quando si desidera limitare il numero di thread in esecuzione in un determinato momento e si desidera evitare il sovraccarico di creazione e distruzione di thread nella propria applicazione. È anche una buona scelta quando nell'applicazione sono presenti molte attività che devono essere eseguite in parallelo o contemporaneamente e si desidera migliorare la reattività dell'applicazione evitando i cambi di contesto. Per creare un pool di thread, puoi sfruttare la classe System.Threading.ThreadPool.

Il frammento di codice seguente mostra come impostare il numero minimo di thread nel pool di thread.

ThreadPool.SetMinThreads (50, 50);

Tuttavia, si noti che quando un'attività a esecuzione prolungata è in esecuzione, il thread del pool di thread potrebbe essere bloccato per molto tempo. A peggiorare le cose, le richieste in arrivo che dipendono dai thread del pool di thread potrebbero essere in attesa o potrebbero anche essere rifiutate principalmente perché il pool di thread potrebbe non avere thread disponibili con esso per gestire una richiesta in arrivo. Un pool di thread non è inoltre una buona scelta quando si hanno thread che differiscono nelle loro priorità o potrebbe essere necessario interrompere prematuramente un thread. Una terminazione prematura di un thread implica che il thread è stato interrotto forzatamente prima che il suo tempo di risposta sia terminato.

Come funziona un pool di thread?

In sostanza, quando si lavora con i pool di thread, si crea in genere una raccolta di thread e si memorizza in un pool di thread prima di utilizzare i thread nella propria applicazione. Come e quando hai bisogno di un thread, potresti riutilizzare quei thread piuttosto che creare nuovi thread ogni volta che l'applicazione deve utilizzare un thread.

Quindi, l'applicazione farebbe una richiesta al pool di thread per ottenere un thread da esso, eseguire attività utilizzando il thread e quindi restituire il thread al pool di thread al termine. I pool di thread sono utili in situazioni in cui sono presenti più attività da eseguire di quante ne sia possibile creare (esiste un limite al numero massimo di thread che è possibile creare per processo) nell'applicazione.

Come posso ottimizzare un pool di thread?

Quando un processo viene avviato, viene allocato un pool di thread da CLR. Si noti che è possibile configurare la dimensione del pool di thread, se necessario. Il runtime gestisce il pool di thread in modo intelligente. Quando il pool di thread viene avviato, è presente un solo thread nel pool di thread. Da quel momento in poi, il gestore del pool di thread (un componente responsabile della gestione del pool di thread) crea più thread e li memorizza nel pool di thread all'aumentare del carico sull'applicazione, ovvero l'applicazione necessita di un numero sempre maggiore di attività da eseguire contemporaneamente.

Il numero di thread che possono essere disponibili nel pool di thread in un dato momento è regolato dal limite massimo consentito di thread nel pool di thread. In altre parole, il numero di thread disponibili nel pool di thread varia di volta in volta a seconda del consumo di thread da parte dell'applicazione. Non appena viene raggiunto il limite massimo (numero massimo di thread nel pool di thread), l'applicazione crea nuovi thread molto più raramente.

È sempre possibile impostare personalmente il limite massimo di thread consentiti nel pool di thread, se necessario. A tale scopo, è necessario sfruttare la proprietà ThreadPool.SetMaxThreads. Per impostare il limite inferiore dei thread nel pool di thread è possibile utilizzare la proprietà ThreadPool.SetMinThreads. Il limite inferiore predefinito del numero di thread nel pool di thread è un thread per processore.