Qual è il concetto di implementazione di Thread-pool (in C con l'aiuto di pthreads)? come può essere assegnato un thread per l'esecuzione dal pool di thread?Che cos'è un pool di thread?
risposta
Un pool di thread è una raccolta di un numero fisso di thread che vengono creati all'avvio dell'applicazione. I thread quindi siedono in attesa di richieste per venire a loro, in genere tramite una coda controllata da un semaforo. Quando viene effettuata una richiesta e c'è almeno un thread in attesa, il thread viene riattivato, assiste la richiesta e torna ad attendere il semaforo. Se non ci sono thread disponibili, le richieste si accodano fino a quando uno è.
thread-piscine sono un modo generalmente più efficiente di gestione delle risorse che semplicemente iniziare un nuovo thread per ogni richiesta. Tuttavia, alcune architetture consentono la creazione e l'aggiunta di nuovi thread al pool durante l'esecuzione dell'applicazione, in base al caricamento della richiesta.
Aggiungendo alla risposta di anon vorrei ricordare che ci sono pool di thread fissi che hanno fissato il numero di filo conduttore in loro; Pool di thread memorizzati nella cache che possono crescere e ridursi dinamicamente quando nessun lavoro è disponibile; I pool di thread dinamici possono anche essere associati al numero massimo di thread e/o alla lunghezza massima della coda di lavoro. Non penso che esista una terminologia impostata per questo genere di cose e raramente si incontrano TP non fissi scritti in C, ma almeno uno dovrebbe sapere che TP fisso non è l'unico tipo là fuori.
chiarire una cosa nelle risposte precedenti:
La ragione per cui un'istanza sempre più thread porta a inefficienza è contesto tempo commutazione. Il sistema operativo cambia periodicamente un thread per un altro sul processore. Ciò comporta il salvataggio dello stato di un thread e il caricamento dello stato di un altro thread dalla memoria, quindi richiede un tempo non trascurabile, N ms, per interruttore di contesto.
Ad esempio, se si hanno 10 fili, il cambio di contesto TAKEX 10 * N ms. Se hai 1000 thread, è 1000 * N ms. Man mano che aumenta il numero di thread simultanei, alla fine il cambio di contesto inizia a sopraffare qualsiasi efficienza derivata dal multithreading. La tua applicazione ha un punto debole in termini di numero di thread migliori. Una volta determinato questo numero dolce per sperimentazione, è possibile impostare la dimensione massima del pool di thread su quel numero di thread, ottenendo in tal modo la massima efficienza dal multithreading.
È improbabile che occorra anche 1 ms per cambiare contesto, in genere sono più simili a noi. Tutto il resto è molto carino. – CrazyCasta
chi ha detto che N era un numero intero e chi ha detto che era> = 1? – Blah0x7B9
L'utilizzo delle unità ms indica che il tempo sarà nell'ordine di ms. Credo che la maggior parte delle persone che leggono la tua risposta non penserebbero che il tempo di commutazione del contesto fosse intorno a noi. – CrazyCasta