Che cos'è un pool di thread?

51

Come si implementerebbe un threadpool? Ho letto su wikipedia per "threadpool", ma non riesco ancora a capire che cosa si dovrebbe fare per risolvere questa domanda (probabilmente perché non ho ben capito cosa sia un threadpool in termini semplici).

Qualcuno può spiegarmi in inglese semplice che cos'è un threadpool e come risponderebbe a questa domanda?

    
posta John Smith 04.11.2012 - 17:14
fonte

4 risposte

87

Un pool di thread è un gruppo di thread inattivi pre-istanziati pronti a essere assegnati al lavoro. Questi sono preferiti per l'istanziazione di nuovi thread per ogni attività quando c'è un gran numero di compiti brevi da fare piuttosto che un piccolo numero di lunghi. Questo evita di dover sostenere il sovraccarico di creare un thread un gran numero di volte.

L'implementazione varierà in base all'ambiente, ma in termini semplificati è necessario quanto segue:

  • Un modo per creare thread e tenerli in uno stato inattivo. Questo può essere ottenuto avendo ogni thread in attesa di una barriera finché la piscina non lo fa funzionare. (Questo potrebbe essere fatto anche con mutex.)
  • Un contenitore per memorizzare i thread creati, come una coda o qualsiasi altra struttura che abbia un modo per aggiungere un thread al pool e estrarne uno.
  • Un'interfaccia standard o una classe astratta per i thread da utilizzare nel lavoro. Questa potrebbe essere una classe astratta chiamata Task con un metodo execute() che esegue il lavoro e quindi restituisce.

Quando il pool di thread viene creato, crea un'istanza di un certo numero di thread da rendere disponibili o creane di nuovi secondo le necessità a seconda delle esigenze dell'implementazione.

Quando il pool riceve una Task , prende un thread dal contenitore (o aspetta che uno diventi disponibile se il contenitore è vuoto), passa a Task e incontra la barriera. Ciò fa riprendere l'esecuzione del thread inattivo, richiamando il metodo execute() del Task che è stato fornito. Una volta completata l'esecuzione, il filo torna alla piscina per essere riposto nel contenitore per il riutilizzo e poi incontra la sua barriera, mettendosi a dormire fino a quando il ciclo si ripete.

    
risposta data 04.11.2012 - 17:55
fonte
8

Il pool di thread è una raccolta di thread gestiti solitamente organizzati in una coda, che eseguono le attività nella coda delle attività.

Creare un nuovo oggetto thread ogni volta che è necessario eseguire qualcosa in modo asincrono è costoso. In un pool di thread è sufficiente aggiungere le attività che si desidera eseguire in modo asincrono alla coda delle attività e il pool di thread si occupa di assegnare un thread disponibile, se presente, per l'attività corrispondente. Non appena l'attività è completata, il thread ora disponibile richiede un'altra attività (supponendo che ce ne sia ancora una).

Il pool di thread ti aiuta a evitare di creare o distruggere più thread di quanto sarebbe realmente necessario.

Vorrei iniziare creando una classe con una coda di thread e una coda di attività. Quindi implementare un metodo che aggiunge un'attività alla coda delle attività e andare avanti da lì. Ovviamente, dovresti anche rendere possibile l'impostazione dei thread consentiti massimi in un pool di thread.

    
risposta data 04.11.2012 - 17:53
fonte
1

Esempio di vita reale;

  1. Struttura: sistema operativo
  2. Sezioni: Applicazioni
  3. Persone: discussioni

Hai una struttura in cui lavorano 12 persone. Ci sono 3 sezioni di questa struttura. Cucina, servizi igienici e sicurezza. Se non usi la tecnica del pool di thread, è così che funziona: tutte le 12 persone si troveranno in una sala riunioni, se i nuovi clienti verranno dalla struttura e chiederanno dei compiti, allora separerai le persone in gruppi e le invierai a fare il loro lavoro e torna alla sala riunioni. Ma, prima di andare al loro dovere, c'è una fase di preparazione. Devono indossare un'uniforme corretta, equipaggiare determinati dispositivi e camminare verso quella sezione, finire il lavoro e tornare indietro. Quindi, una volta ogni volta che finiscono il loro lavoro (fine del filo), devono tornare alla sala riunioni, svestirsi l'uniforme, prendere le attrezzature e attendere il prossimo lavoro. Questi si riferiscono alla creazione del contesto del thread, l'allocazione della memoria e le informazioni di tracciamento dal sistema operativo. È troppo dispendioso in termini di tempo per il sistema operativo per riorganizzare le nuove esigenze di thread.

Se si utilizza il pooling di thread, quindi, al mattino presto, assegnerà 6 persone alla cucina, 2 persone al bagno e 4 persone alla sicurezza. Quindi, faranno la loro preparazione solo una volta al giorno. Anche se non ci sono clienti in cucina, quelle 4 persone saranno lì, al minimo, per eventuali attività imminenti. Non è necessario tornare alla sala riunioni finché la cucina non si chiude (l'app termina). Queste 4 persone si trovano nel pool di app di Kitchen e sono pronte a servire rapidamente. Ma non puoi prometterti che stanno lavorando tutto il giorno, dal momento che la cucina può essere inattiva di tanto in tanto. La stessa logica si applica anche ai servizi igienici e alla sicurezza.

Nel primo scenario, non si spreca alcun thread per nessuna attività, MA ci vorrà una buona quantità di tempo per preparare ogni singolo thread per ogni attività. Nella seconda, preparate i thread in anticipo, quindi non potete garantire che userete tutti i thread per tutte le attività, ma il sistema operativo è in gran parte ottimizzato, quindi potete fare affidamento su di esso.

    
risposta data 24.02.2017 - 22:28
fonte
0

Nell'applicazione multithread, il pool di thread è un "pool di thread disponibili" che può essere utilizzato dall'applicazione. Solitamente, ad es. .NET, è tutto gestito in modo da assegnare solo compiti e una volta che un thread è gratuito, lo eseguirà. Quindi, per implementare un threadpool, mi aspetto di creare un concetto in cui le attività vengono prese automaticamente da thread liberi senza la creazione esplicita del thread per ogni attività.

    
risposta data 04.11.2012 - 17:29
fonte

Leggi altre domande sui tag