Cosè un pool di thread?

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 un inglese semplice che cosè un pool di thread e come risponderebbe a questa domanda?

Answer

Un thread pool è un gruppo di thread inattivi preistanziati che sono pronti per ricevere il lavoro.Questi sono preferiti rispetto allistanza di nuovi thread per ogni attività quando cè un gran numero di attività brevi da eseguire piuttosto che un piccolo numero di quelle lunghe. Ciò evita di dover sostenere il sovraccarico della creazione di un thread un gran numero di volte.

Limplementazione varierà in base allambiente, 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 ogni thread attenda su una barriera fino a quando il pool non lo fa funzionare (questo potrebbe essere fatto con i mutex pure.)
  • Un contenitore per memorizzare i thread creati, come una coda o qualsiasi altra struttura che abbia un modo per aggiungere un thread al pool ed estrarne uno.
  • Uninterfaccia standard o una classe astratta per i thread da utilizzare durante il lavoro. Questa potrebbe essere una classe astratta chiamata Task con un metodo execute() che fa il lavoro e poi restituisce.

Quando il pool di thread viene creato, istanzerà un certo numero di thread per renderli disponibili o ne creerà di nuovi secondo necessità a seconda delle esigenze dellimplementazione.

Quando al pool viene consegnato un Task, prende un thread dal contenitore (o attende che uno diventi disponibile se il contenitore è vuoto), gli passa un Task, e incontra la barriera. Ciò fa sì che il thread inattivo riprenda lesecuzione, invocando il metodo execute() del Task fornito. Una volta completata lesecuzione, il thread si restituisce al pool per essere inserito nel contenitore per il riutilizzo e quindi incontra la sua barriera, mettendosi a dormire finché il ciclo non si ripete.

Commenti

  • Un pool di thread è un gruppo di thread inattivi preistanziati che sono pronti per ricevere il lavoro. […] Questo evita di dover sostenere loverhead di creare un thread un gran numero di volte. – questo dovrebbe essere sputato da Google ogni volta che qualcuno cerca ” thread pool ”
  • La creazione di pool di thread comporta una barriera interna? Puoi condividere riferimenti, su queste righe?
  • @overexchange No, non lo fa. Il mio riferimento a questa domanda è stato un esempio di un modo migliore per riscrivere la tua domanda barriera . (Se lo fai, scriverò una risposta.)
  • una delle migliori risposte brevi.

Risposta

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

Creare un nuovo oggetto thread ogni volta che hai bisogno di qualcosa da eseguire in modo asincrono è costoso. In un pool di thread aggiungeresti semplicemente le attività che desideri vengano eseguite in modo asincrono alla coda delle attività e il pool di thread si occuperà di assegnare un thread disponibile, se presente, per lattività corrispondente. Non appena lattività è completata, il thread ora disponibile richiede unaltra attività (supponendo che ne sia rimasta).

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

Inizierei creando una classe con una coda di thread e una coda di attività. Quindi implementare un metodo che aggiunge unattività alla coda delle attività e procedere da lì. Ovviamente, dovresti anche rendere possibile impostare il numero massimo di thread consentiti in un pool di thread.

Risposta

Esempio di vita reale;

  1. Struttura: sistema operativo
  2. Sezioni: applicazioni
  3. Persone: thread

Hai una struttura lì 12 persone stanno lavorando. Ci sono 3 sezioni di questa struttura. Cucina, servizi igienici e sicurezza. Se non si utilizza la tecnica del pool di thread, funziona così: tutte e 12 le persone si troveranno in una sala riunioni, se nuovi clienti vengono dalla struttura e chiedono attività, separerai le persone in gruppi e le invierai a fare il loro lavoro e tornare in sala riunioni. Ma, prima di andare al loro dovere, cè una fase di preparazione. Devono indossare luniforme corretta, equipaggiare determinati dispositivi e raggiungere quella sezione, finire il lavoro e tornare. Quindi, una volta ogni volta che finiscono il loro lavoro (il thread finisce), devono tornare alla sala riunioni, svestire luniforme, estrarre lattrezzatura e attendere il lavoro successivo. Questi si riferiscono alla creazione del contesto del thread, lallocazione della memoria e il monitoraggio delle informazioni dal sistema operativo.Il sistema operativo richiede troppo tempo per riorganizzare le nuove esigenze di thread.

Se stai usando il pool di thread, la mattina 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 qualsiasi compito imminente. Non è necessario che tornino nella sala riunioni fino alla chiusura della cucina (lapp termina). Queste 4 persone si trovano nel pool di app di Kitchen e sono pronte per essere servite rapidamente. Ma non puoi promettere che lavorano tutto il giorno, dal momento che la cucina potrebbe diventare inattiva di tanto in tanto. La stessa logica si applica anche ai servizi igienici e alla sicurezza.

Nel primo scenario, non sprechi alcun thread per nessuna attività, MA ci vorrà una buona quantità di tempo per preparare ogni singolo thread per ogni attività. Nella seconda, prepari i thread in anticipo, quindi non puoi garantire che utilizzerai tutti i thread per tutte le attività, ma il sistema operativo per lo più fa unottima ottimizzazione su di esso, quindi puoi fare affidamento su di esso. h2> Risposta

Nellapplicazione multithread, il pool di thread è un “pool di thread disponibili” che può essere utilizzato dallapplicazione. Di solito, ad es. .NET, è tutto gestito in modo da assegnare solo attività e una volta che un thread è libero, lo eseguirà. Quindi, per implementare un pool di thread, mi aspetto di creare un concetto in cui le attività vengono automaticamente prese da thread liberi senza la creazione di thread esplicita per ogni attività.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *