2014-10-03 12 views
17

Sembra che la classe Task ci fornisca la possibilità di utilizzare più processori del sistema. La classe Thread funziona anche su più processori o utilizza il time slicing solo su un singolo processore? (Supponendo un sistema con più core).I thread sono eseguiti su più processori?

La mia domanda è se i thread saranno/potrebbero essere eseguiti su più core allora cosa c'è di così speciale su Task e parallelismo?

+0

Questo è probabilmente o/S dipendente e non determinato dal framework .Net. Sarebbe bello saperlo con certezza. – Polyfun

+2

Tieni presente che le attività di default sono pensate per attività molto veloci (meno di 200 ms); il parallelismo/concorrenza così legato all'elaborazione non dovrebbe essere un grande requisito. Se * si * desidera disporre di attività parallele/concomitanti, con esecuzione prolungata, preferire Task.Run su TaskFactory.StartNew ed essere causa per utilizzare un overload che accetta 'TaskCreationOptions' e utilizzare' TaskCreationOptions.LongRunning'. In caso contrario, potrebbero verificarsi effetti negativi sul pool di thread che potrebbe annullare lo scopo della concorrenza. –

+0

Eventualmente correlato: http://stackoverflow.com/q/12328751 – stakx

risposta

11

-E sembra che classe Task ci forniscono la possibilità di utilizzare su più processori nel sistema.

-se i thread possono/possono essere eseguiti su più core, cosa c'è di così speciale in Parallelismo di attività?

La classe Task è solo una piccola, ma importante, parte di TPL (Task Parallel Library). TPL è un'astrazione di alto livello, quindi non devi lavorare direttamente con i thread. Incapsula e nasconde la maggior parte del churn che dovresti implementare per qualsiasi applicazione multi-thread decente.

Le attività non introducono alcuna nuova funzionalità che non è possibile implementare da soli, di per sé (che è il nucleo delle vostre domande, credo). Possono essere sincroni o asincroni: quando sono asincroni, utilizzano la classe Thread internamente o le porte IOCP.

Alcuni dei punti affrontati da TPL sono:

  • rigenerare eccezioni un filo bambino sul thread chiamante.
  • codice asincrono (filo lancio -> eseguire codice arbitrario in attesa di thread figlio -> curriculum quando thread figlio è finita), sembra come se fosse sincrona, migliorando notevolmente la leggibilità e la manutenibilità
  • più semplice filo cancellazione (usando CancellationTokenSource)
  • query parallele/manipolazione dei dati utilizzando PLINQ o la classe Parallel
  • Asynchronous flussi di lavoro mediante TPL Dataflow
+1

Grazie mille per la risposta e per affrontare il problema principale. Credo di non essere stato abbastanza chiaro nella mia domanda. Quindi non c'è differenza rispetto al parallelismo rispetto a TPL e ad un thread classico. Dal momento che entrambi utilizzeranno internamente il time slicing o più core basati sul sistema operativo, giusto? – CriketerOnSO

+0

@CriketerOnSO corretto :) TPL è un set di librerie parzialmente costruito sulla classe 'Thread' esistente. – dcastro

+0

grazie ancora, ha accettato la tua risposta – CriketerOnSO

16

Quando si crea un thread forma un gruppo logico di lavoro. .NET Framework acquisirà CPU-Time dal sistema. Molto probabilmente più thread verranno eseguiti su core diversi (Questo è qualcosa che il sistema handeles - nemmeno .NET ha alcuna influenza su questo)

Ma potrebbe essere possibile che il sistema eseguirà tutti i tuoi thread sullo stesso core o anche sposta l'esecuzione tra più core durante l'esecuzione. Tieni presente che stai gestendo gestito da Thread e non reale Thread di sistema.

(correttamente parlato dovrei dire:. Il sistema potrebbe eseguire il gestito Le discussioni all'interno dello stesso sistema-Thread o l'uso multiplo System-Fili per più thread gestiti)

Forse si vuole dai un'occhiata a questo post del blog: http://www.drdobbs.com/parallel/managed-threads-are-different-from-windo/228800359 La spiegazione è abbastanza buona in termini di dettagli.

+2

Grazie per le risposte, se i thread saranno/potrebbero essere eseguiti su più core, cosa c'è di così speciale in Parallelismo delle attività? – CriketerOnSO

+0

Forse era un po 'di brutta parola: non funzionerà su più core allo stesso tempo. Ma potrebbe essere spostato da "core to core" mentre il sistema decide di farlo. (Può anche essere sospeso nel frattempo per priorizzare altri thread ecc ...) – dognose

9

Non è una cattiva prima domanda. +1

Ti suggerisco di leggere Threading in C# by Joseph Albahari. Se andate a leggere attraverso il post troverete:

Come Threading Opere

Multithreading è gestito internamente da un thread scheduler, una funzione il CLR tipicamente delega al sistema operativo. Un programma di pianificazione thread assicura che tutti i thread attivi siano assegnati all'ora di esecuzione appropriata e che i thread in attesa o bloccati (per l'istanza , su un blocco esclusivo o sull'input dell'utente) non consumino la CPU .

Quindi il multi-threading viene gestito dal sistema operativo tramite un programmatore di thread.

Inoltre il palo ha:

In un multi-processore del computer, multithreading viene implementato con una miscela di tempo affettamento e genuina concorrenza, dove diverse thread eseguono codice contemporaneamente su diversi CPU. È quasi certo che ci sarà ancora un po 'di time-slicing, a causa del funzionamento del sistema che richiede i propri thread - così come quelli di altre applicazioni .

+1

Grazie per la risposta. – CriketerOnSO

+2

La tua osservazione "Non è una cattiva prima domanda .1" dovrebbe essere spostata in un commento sulla domanda, in quanto non sarà pertinente o utile per gli altri utenti che trovano questa domanda. – Spooky

Problemi correlati