Che cos'è un pool di thread?


62

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

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

Risposte:


96

Un pool di thread è un gruppo di thread inattivi pre-istanziati che sono pronti per ricevere lavoro. Questi sono preferiti rispetto all'istanza di nuovi thread per ciascuna attività quando è necessario eseguire un numero elevato di attività brevi anziché un numero limitato di attività lunghe. Questo evita di dover sostenere il sovraccarico di creare un thread un gran numero di volte.

L'implementazione varierà a seconda dell'ambiente, ma in termini semplificati, è necessario quanto segue:

  • Un modo per creare thread e mantenerli in uno stato inattivo. Ciò può essere ottenuto facendo in modo che ciascun thread attenda una barriera fino a quando il pool non lo passa. (Questo potrebbe essere fatto anche con i mutex.)
  • Un contenitore per archiviare i thread creati, come una coda o qualsiasi altra struttura che ha un modo per aggiungere un thread al pool ed estrarne uno.
  • Un'interfaccia standard o una classe astratta per i thread da utilizzare nel fare il lavoro. Potrebbe trattarsi di una classe astratta chiamata Taskcon un execute()metodo che fa il lavoro e poi ritorna.

Quando viene creato il pool di thread, verrà creata un'istanza di un determinato numero di thread per renderli disponibili o ne creerà di nuovi in ​​base alle esigenze dell'implementazione.

Quando il pool viene consegnato a Task, prende un thread dal contenitore (o attende che uno diventi disponibile se il contenitore è vuoto), lo passa a Taske incontra la barriera. Questo fa riprendere l'esecuzione del thread inattivo, invocando il execute()metodo che gli Taskè stato dato. Una volta completata l'esecuzione, il thread restituisce se stesso al pool per essere messo nel contenitore per il riutilizzo e quindi incontra la sua barriera, mettendosi a dormire fino a quando il ciclo si ripete.


19
Un pool di thread è un gruppo di thread inattivi pre-istanziati che sono pronti per ricevere lavoro. [...] Ciò impedisce di dover sostenere un sovraccarico di creazione di un thread un gran numero di volte. - questo dovrebbe essere sputato da Google ogni volta che qualcuno cerca "pool di thread"
Rafael Eyng

La creazione di pool di thread comporta una barriera interna? Puoi condividere riferimenti, su queste righe?
Scambio eccessivo il

@overexchange No, non lo fa. Il mio riferimento a questa domanda era un esempio di un modo migliore per riscrivere la tua domanda di barriera . (Se lo farai, scriverò una risposta.)
Blrfl,

una delle migliori risposte brevi.
Blood-HaZaRd

10

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

La creazione di un nuovo oggetto thread ogni volta che è necessario eseguire qualcosa in modo asincrono è costosa. In un pool di thread aggiungere semplicemente 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 ne sia rimasta).

Il pool di thread ti aiuta a evitare di creare o distruggere più thread, di quanto sarebbe davvero 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 passare da lì. Ovviamente, dovresti anche consentire di impostare il numero massimo di thread consentiti in un pool di thread.


1

Nell'applicazione multithread, il pool di thread è un "pool di thread disponibili" che può essere utilizzato dall'applicazione. Di solito, ad esempio .NET, è tutto gestito, quindi è sufficiente assegnare attività e una volta che un thread è gratuito, lo eseguirà. Quindi, per implementare un pool di thread, mi aspetterei di creare un concetto in cui le attività vengono automaticamente eseguite da thread gratuiti senza la creazione esplicita di thread per ogni attività.


1

Esempio di vita reale;

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

Hai una struttura lì 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 e 12 le persone saranno in piedi in una sala riunioni, se i nuovi clienti arrivano per struttura e chiedono attività, 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 l'uniforme corretta, equipaggiare determinati dispositivi e camminare verso quella sezione, terminare il lavoro e tornare. Quindi, una volta ogni volta che finiscono il loro lavoro (il filo finisce), devono tornare alla sala riunioni, spogliarsi l'uniforme, estrarre l'attrezzatura e attendere il prossimo lavoro. Si riferiscono alla creazione di un contesto di thread, si tratta di allocazione di memoria e informazioni di tracciamento da parte del sistema operativo.

Se stai utilizzando il pool di thread, quindi, al mattino presto, assegnerai 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 i compiti imminenti. Non è necessario tornare alla sala riunioni fino alla chiusura della cucina (l'app termina). Queste 4 persone si trovano nel pool di app Kitchen e sono pronte per essere pubblicate rapidamente. Ma non puoi promettere che stanno lavorando tutto il giorno, poiché la cucina può diventare di tanto in tanto inattiva. La stessa logica si applica anche ai servizi igienici e alla sicurezza.

Nel primo scenario, non sprecare alcun thread per qualsiasi attività, MA ci vorrà una buona quantità di tempo per preparare ogni singolo thread per ogni attività. Nel secondo, prepari i thread in anticipo, quindi non puoi garantire che utilizzerai tutti i thread per tutte le attività, ma il sistema operativo principalmente lo ottimizza, quindi puoi fare affidamento su di esso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.