La differenza tra un pool di thread e un pool di oggetti è uguale alla differenza tra una Toyota Corolla e un veicolo.
Un pool di oggetti è un pool di oggetti. Un pool di thread è un pool di oggetti, ma non qualsiasi tipo di oggetto, solo thread.
Entrambi hanno lo stesso scopo di base: oggetti costosi da creare, costosi da distruggere, numero limitato o qualsiasi combinazione di questi, vengono memorizzati anziché distrutti quando non sono più necessari e riutilizzati invece di creati quando è necessario un "nuovo".
Si noti che nel caso generale, il pool di oggetti è un anti -pattern. Gli oggetti non dovrebbero essere costosi. Se lo sono, allora c'è qualcosa di sbagliato nel tuo ambiente di runtime. In un linguaggio OO, non dovrebbe avere bisogno di non pensare se puoi permetterti di creare o meno un oggetto. Gli oggetti sono la base di OO, se il tuo runtime non può gestire un paio di milioni di oggetti, ottenerne uno migliore.
Allo stesso modo, nella programmazione multi-thread, i thread sono gli elementi costitutivi di base e il tuo runtime non dovrebbe limitarti nel modo in cui li stai usando. Ad esempio, sulla macchina virtuale BEAM / HiPE, è possibile creare 10 milioni di processi (si noti che i processi sono molto più costosi dei thread; in pratica i thread hanno solo un puntatore di istruzioni, uno stack e alcuni thread limitati) archiviazione locale, i processi hanno il loro heap, la loro memoria protetta e su BEAM / HiPE anche i propri garbage collector) su un laptop a 32-bit di 15 anni senza nemmeno una goccia di sudore, quindi non è impossibile fare i thread a buon mercato.
Tuttavia, viviamo nel mondo reale, e ci sono alcuni ambienti di runtime in cui i thread sono così costosi che riutilizzarli è una necessità. Ad esempio, su Linux, un thread pesa 4 KiByte o 8 KiByte rispetto a un processo BEAM / HiPE, che è solo ~ 300 Byte. Ed è qui che entra in gioco il pool di thread.
Creiamo un certo numero di thread (in genere nello stesso ordine in cui abbiamo core CPU per il calcolo più un paio di I / O). E poi creiamo un'astrazione leggera (chiamiamola CodeSnippet
) che è fondamentalmente la stessa cosa di un thread o di un processo, ma leggera, e possiamo creare il maggior numero di quelli che vogliamo. Quando vogliamo eseguire uno di questi frammenti di codice, estraiamo un thread dal nostro pool, lo eseguiamo, prendiamo il risultato, disponiamo lo snippet di codice (ricordate, è leggero, quindi creare e distruggere non è un problema) e inserire il thread di nuovo in piscina. In questo modo, possiamo avere un'astrazione leggera di una cosa simile a un thread mappata ai thread attuali senza dover creare un numero elevato di thread o limitarci a utilizzare solo un numero limitato di oggetti simultanei.