2012-01-10 82 views
7

我有一個雙核心處理器,根據說明我只能使用2個線程,但實際上我能夠同時啓動2個以上的線程:雙核心機器上的多線程?

這裏是一個解釋的副本:

靜態hardware_concurrency()方法,由 升壓::線程類提供時,返回可以 物理上基於CPU或CPU內核的底層數 同時執行的線程的數目。在常用的 雙核機器上調用此函數,返回值2。這允許簡單的 方法來確定給定的多線程應用程序應該同時使用 的理論最大線程數。

hardware_concurrency()方法在我的情況下返回2號,但這個程序使用4個線程在同一時間:

#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; 
} 

任何人都可以解釋這種行爲?

+7

,只要你想(到了極限)可以使盡可能多的線程,但2完成(可能)最佳數量,每個核心一個。另外,它說「同時實際執行」。你可以超過2個,但他們不會同時運行;操作系統將不得不搶先運行,讓其他人運行。另外,它說「應該」,而不是「可以」。 – 2012-01-10 20:02:26

+0

以及在雙核機器上使用例如10個線程應用程序會產生哪些副作用?那是不是好?非常感謝。 – codekiddy 2012-01-10 20:04:39

+1

副作用(可能)僅限於您的應用程序運行速度較慢(因爲操作系統不得不擔心讓每個其他線程都有時間運行,其中有2個,它可以讓它們全速運行),儘管這可能會抵消通過能夠「同時」做更多(不是一次,而是獨立)。 – 2012-01-10 20:05:45

回答

19

術語線程通常包括三個抽象層:

  1. 用戶線程是由應用程序啓動的線程,並且被映射N:M到:
  2. 內核線程,其是由所述託管線程操作系統映射到N:M到:
  3. 硬件線程,它們是可用的實際物理資源。

應用程序啓動的4個線程是由類別1(用戶線程)啓動的,而由該函數返回的值2則指向類別3(硬件線程)。由於跨層的映射爲N:M,因此可以看到可以將多個用戶線程映射到較少數量的硬件線程。說到這一點,如果您正在進行密集型計算,通常會啓動超過2倍的硬件線程數量,這會由於上下文切換和資源爭用而損害性能。

+1

+1,不同類型的線程之間的關係很好的解釋 – 2012-01-10 20:07:26

+0

是啊+1從我也是。很好的解釋。 – 2012-01-10 20:09:44

+0

非常感謝你的解釋。 – codekiddy 2012-01-10 20:17:31

6

即使在單核機器上,您也可以始終運行多個線程。儘管如此,它們不能並行運行。 (超過2你的情況)

例如,一個線程做的GUI,另取一些工作從服務器...

進行更深層次的解釋見this

1

您可以使用比處理器內核多的線程。這可以帶來以下好處:您可以隱藏通信(例如,文件I/O或網絡)與計算,或在時間片系統中獲得更多處理器時間。使用兩個內核時,只有兩個線程將同時在物理上執行,但擁有更多線程可以提高性能。這是你需要調整的東西。

1

最佳結果和可能結果之間存在差異;同時在物理和理論上運行的線程之間也存在差異。在雙核計算機中,有兩個CPU,可以同時在物理上執行兩個線程。但任何線程系統/線程庫的重要性在於,您可以根據需要在邏輯上創建線程。這些線程並不會在同一時間運行,它們會週期性地切換,以產生幻覺,彷彿它們同時運行。

1

第一個叫paralell程序,第二個是多任務處理,可即使在單處理器機器