2010-01-12 15 views

risposta

21

A "pool" contiene un elenco di "fili" disponibili pronti per essere utilizzati mentre "riproduttiva" si riferisce alla creazione realtà un nuovo filo.

L'utilità di "Pooling Discussione" si trova nel "time-to-use inferiore": la creazione di tempo di overhead è evitata.

In termini di "quale è meglio": dipende. Se il sovraccarico in fase di creazione è un problema, utilizzare Thread-pooling. Questo è un problema comune in ambienti in cui devono essere eseguite molte "attività di breve durata".


Come sottolineato da altre persone, c'è un "overhead di gestione" Filetto-Pooling: questo è minimo se correttamente attuato. Per esempio. limitare il numero di thread nel pool è banale.

+1

c'è una grande differenza (in termini di consumo di tempo) nella creazione di un nuovo thread rispetto al prelievo di un'attività da una coda e alla sua allocazione a un thread da un pool, su windows xp OS? – reonze

+0

Non ho fatto alcuna programmazione seria di Windows da anni ma sono abbastanza sicuro che scegliere un thread disponibile da un elenco (operazione semplice) è molto più economico che generare un nuovo thread. – jldupont

+2

Generare un nuovo thread fisico significherà una transizione in modalità Kernel e l'impostazione di una serie di strutture del kernel, quindi il sovraccarico sarà più alto. Ma come tutti sappiamo, non dovresti ottimizzare prima del tempo.Se crei solo un thread, non noterai il sovraccarico, se ne crei migliaia probabilmente lo farai, ma anche quello probabilmente dipende dal lavoro che sta facendo il thread, il che potrebbe far ammalare il tempo necessario per creare il thread. –

1

Dipende da ciò che si desidera eseguire sull'altro thread.

Per brevi compito è meglio utilizzare un pool di thread, per lungo tempo compito può essere migliore per deporre le uova un nuovo thread come potrebbe morire di fame il pool di thread per altri compiti.

+1

È anche utile per l'analisi delle prestazioni e la registrazione che è possibile rinominare un thread generato e quindi facilitare l'analisi delle prestazioni. Se si tratta di un threadpool, diventa più difficile indovinare quale thread appartiene a quale attività. – weismat

9

Per alcuni definizione di "migliore", in genere si consiglia di andare con un pool di thread. Senza sapere quale sia il tuo caso d'uso, considera che con un pool di thread hai un numero fisso di thread che possono essere creati all'avvio o che possono essere creati su richiesta (ma il numero di thread non può eccedere la dimensione del pool). Se viene inviata un'attività e nessun thread è disponibile, viene messo in coda fino a quando non c'è un thread libero per gestirlo.

Se si generano i thread in risposta a richieste o qualche altro tipo di trigger, si rischia di esaurire tutte le risorse poiché non c'è nulla per limitare la quantità di thread creati.

altro vantaggio per infilare il pool è riuso - gli stessi fili sono utilizzati ripetutamente per gestire compiti diversi, anziché dover creare un nuovo thread ogni volta.

Come sottolineato da altri, se si dispone di un piccolo numero di attività che verranno eseguite per un lungo periodo, ciò annullerebbe i vantaggi ottenuti evitando la creazione frequente di thread (poiché non sarebbe necessario creare una tonnellata di thread in ogni caso).

+2

Non vi è alcun motivo per cui non sia possibile limitare il numero di thread generati. –

+1

È vero, non ho affermato che fosse impossibile. Ma allora perché non usare una piscina? – danben

+0

Beh, a meno che 'generalmente' sia un compito relativamente lungo in esecuzione (qualsiasi cosa in pochi secondi è, in realtà). (Ab) l'utilizzo del threadpool per operazioni di lunga durata potrebbe portare a brutte forme di deadlock ecc. –

2

La differenza principale è che un ThreadPool mantiene un set di thread già spun-up e disponibili per l'uso, poiché l'avvio di un nuovo thread può essere costoso dal punto di vista del processore.

Nota che anche un ThreadPool ha bisogno di "spawn" thread ... di solito dipende dal carico di lavoro - se c'è molto lavoro da fare, un buon threadpool farà girare nuovi thread per gestire il carico basato su configurazione e risorse di sistema.

5

Tutto dipende dallo scenario. La creazione di nuovi thread richiede molte risorse e un'operazione costosa. La maggior parte delle operazioni asincrone molto brevi (meno di pochi secondi al massimo) potrebbe fare uso del pool di thread.

Per le operazioni di esecuzione più lunghe che si desidera eseguire in background, in genere si crea (genera) il proprio thread. (Ab) l'utilizzo di un threadpool di piattaforma/runtime incorporato per operazioni di lunga durata potrebbe portare a forme di deadlock sgradevoli, ecc.

0

C'è poco tempo extra per la creazione/generazione di thread, dove come thread poll contiene già thread creati che sono pronti per essere utilizzati.

4

La mia sensazione è che si dovrebbe iniziare semplicemente creando un thread, se necessario ... Se le prestazioni di questo sono OK, allora hai finito. Se ad un certo punto, si rileva che è necessaria una minore latenza attorno alla creazione di thread, è generalmente possibile rilasciare un pool di thread senza rompere nulla ...

25

I thread del pool di thread sono molto più economici di un thread normale, raggruppano le risorse di sistema richieste per discussioni. Ma hanno un certo numero di limitazioni che possono renderli inadatti:

  • Non è possibile interrompere un filo di thread
  • Non v'è alcun modo semplice per rilevare che un ThreadPool completato, senza Thread.Join()
  • Ci è alcun modo semplice per maresciallo eccezioni da un filo di thread
  • non è possibile visualizzare qualsiasi tipo di interfaccia utente su un thread di thread di là di una finestra di messaggio
  • un filo di thread non dovrebbe correre più di pochi secondi
  • un filo pool thread non dovrebbe bloccare per molto tempo

Gli ultimi due vincoli sono un effetto collaterale dello scheduler del threadpool, esso tenta di limitare il numero di thread attivi al numero di core disponibili dalla CPU. Questo può causare lunghi ritardi se si pianificano molti thread a lunga esecuzione che si bloccano spesso.

Molte altre implementazioni di threadpool hanno vincoli simili, dare o avere.

+2

Questa risposta è totalmente specifica per lingua/piattaforma, ma formulata come se fosse una risposta generale. Dal momento che l'OP non ha menzionato né una piattaforma né una lingua: -1 –

+0

d'accordo con te. – Rubyrider

1

Il pool di thread è in genere considerato migliore, poiché i thread vengono creati in primo piano e utilizzati come richiesto. Pertanto, se si utilizzano molti thread per attività relativamente brevi, può essere molto più veloce. Questo perché vengono salvati per uso futuro e non vengono distrutti e successivamente ricreati.

Al contrario, se hai bisogno solo di 2-3 thread e verranno creati solo una volta, allora sarà meglio. Questo perché non si ottiene dalla memorizzazione nella cache di thread esistenti per l'utilizzo futuro e non si creano thread aggiuntivi che potrebbero non essere utilizzati.

Problemi correlati