2012-01-10 10 views
7

Ho un processore dual core e secondo la spiegazione sono in grado di utilizzare solo 2 thread ma in realtà sono in grado di avviare più di 2 thread allo stesso tempo:multithreading su macchina dual core?

Ecco una copia della spiegazione:

procedimento hardware_concurrency statico(), fornito dalla classe boost :: filo, restituisce il numero di fili che potrebbero fisicamente essere eseguiti contemporaneamente in base al numero sottostante di CPU o CPU core. Chiamando questa funzione su una macchina dual-core comunemente utilizzata, viene restituito un valore di 2. Ciò consente un semplice metodo per identificare il numero massimo teorico di thread che deve essere utilizzato contemporaneamente da una determinata applicazione multithread.

hardware_concurrency() restituisce il numero 2 nel mio caso, ma questo programma utilizza 4 thread allo stesso tempo:

#include <iostream> 
#include <boost\thread.hpp> 

using namespace std; 
using boost::thread; 
using namespace boost::this_thread; 
using boost::posix_time::seconds; 

void f1() 
{ 
    for(int i = 0; i < 10; ++i) 
    { 
     cout << i << endl; 
     sleep(seconds(2)); 
    } 
} 

void f2() 
{ 
    for(int i = 0; i < 10; ++i) 
    { 
     cout << i << endl; 
     sleep(seconds(2)); 
    } 
} 

int main() 
{ 
    // 4 threads are executed on dual core machine (no problem) 
    thread thr1(f1); 
    thread thr2(f2); 
    thread thr3(f1); 
    thread thr4(f2); 
    cin.ignore(); 
    return 0; 
} 

Qualcuno può spiegare che il comportamento?

+7

Si può fare come tanti fili che si desidera (fino al limite), ma 2 è (probabilmente) il numero ottimale, uno per ogni core. Inoltre, dice "eseguito fisicamente allo stesso tempo". Puoi fare più di 2, ma non correranno fisicamente nello stesso momento; il sistema operativo dovrà anticipare quelli in esecuzione per consentire ad altri di funzionare. Inoltre, dice "dovrebbe", non "può". –

+0

e quali sono gli effetti collaterali utilizzando per esempio l'applicazione con filettatura 10 su computer dualcore? è cattivo o no? molte grazie. – codekiddy

+1

Gli effetti collaterali sono (probabilmente) limitati all'applicazione in esecuzione più lenta (poiché il sistema operativo deve preoccuparsi di lasciare che ogni altro thread abbia il suo tempo di funzionare, dove con 2, consente di eseguire la piena velocità continuamente), anche se può essere spostato essendo in grado di fare di più "contemporaneamente" (non proprio allo stesso tempo, ma indipendentemente). –

risposta

19

Le discussioni termine copre solitamente tre livelli di astrazione:

  1. filati utenti sono discussioni avviate da applicazioni e sono mappate N: M a:
  2. Kernel fili, che sono thread gestiti dal sistema operativo, mappato N: M a:
  3. Thread di hardware, che sono le risorse fisiche effettive disponibili.

I 4 thread che hai detto vengono lanciati dall'applicazione provengono dalla categoria 1 (thread utente), mentre il valore 2 restituito da tale funzione fa riferimento alla categoria 3 (thread hardware). Poiché la mappatura è N: M tra i livelli, è possibile vedere che è possibile associare più thread utente a un numero inferiore di thread hardware.

Detto questo, in genere l'avvio di più di due volte il numero di thread hardware se si eseguono calcoli intensivi danneggerà le prestazioni a causa di interruttori di contesto e conflitto di risorse.

+1

+1, buona spiegazione delle relazioni tra i diversi tipi di thread –

+0

yeah +1 Anche da me. Buona spiegazione –

+0

grazie mille per quella spiegazione. – codekiddy

6

È sempre possibile eseguire più thread, anche su una macchina single core. Tuttavia, non possono funzionare in parallelo. (Più di 2 nel tuo caso)

Per esempio, un thread fa la GUI, l'altro recupera un certo lavoro dal server ...

Vedi this per una spiegazione più profonda.

1

È possibile utilizzare più thread rispetto ai core del processore. Questo può avere diversi vantaggi: puoi nascondere la comunicazione (ad es. I/O di file o rete) con il calcolo o ottenere più tempo del processore nei sistemi di time-slicing. Con due core, solo due thread si eseguiranno fisicamente allo stesso tempo, ma avere più thread può aumentare le prestazioni. È qualcosa che devi sintonizzare.

1

C'è una differenza tra risultati ottimali e possibili; c'è anche una differenza tra i fili fisicamente e teoricamente in esecuzione allo stesso tempo.In un computer dual-core, ci sono 2 CPU, che sono in grado di eseguire due thread in modo fisico allo stesso tempo. Ma il significato di qualsiasi sistema di thread/libreria di thread è che si è in grado di creare logicamente come thread mediocri come si desidera. Questi thread non funzioneranno nello stesso momento, ma verranno periodicamente scambiati per fare l'illusione come se stessero correndo simultaneamente.

1

La prima chiamata di programmazione paralell e la seconda è multi tasking che può essere fatto anche in una macchina a singolo processore

Problemi correlati