2016-12-16 84 views
0

我有一個想法來檢測PC的核心數量,但我不確定它是否工作。下面是代碼:
是否有可能使用thread_sleep來檢測核心數量

int sleepSec = 2; // 2 sec 
void funcSleep() 
{ 
    sleep(sleepSec); 
} 

const int SIZE = 4; 
threadArr arr[SIZE]; 
int begin_time = getCurrentTime(); 
for(int i = 0; i < SIZE; i++) 
{ 
    arr[i] = thread_create(funcSleep); 
} 
for(int i = 0; i < SIZE; i++) 
{ 
    thread_join(arr[i]); 
} 
int end_time = getCurrentTime(); 
print("The number of cores = "); 
print(sleepTime * SIZE/(end_time - start_time)); 

如果我們忽略所有的延遲,我覺得上面的代碼能告訴我電腦的核心數量。

總之,如果管理多線程的策略是:如果可能的話,將線程分配給未使用的內核。代碼應該運行良好。
如果不是,你能解釋一下PC如何處理多線程?

回答

0

沒有可靠的方式。當一個線程正在休眠時,可以在同一個內核上調度(執行)其他線程。

在單個核心機器上,將安排第一個線程。在幾微秒內,睡眠系統調用將意味着內核調度程序驅逐該進程(因爲在接下來的2秒內它不會做任何有用的事情,所以不妨讓其他進程同時運行)。然後,另一個進程將安排,最終你的一個。這將稱爲睡眠系統調用,並且第三個進程被安排。如果電腦閒置,您的程序將在任何電腦上運行大約2秒鐘。

有系統調用你可以做,它明白返回計算機中的CPU的整數。

N.B.沒有睡眠系統調用;實際上,每當睡眠線程調度完畢,他們就會查看時間,意識到他們已經睡得不夠長了,並將控制權交還給內核調度程序,驅逐自己以便其他事情能夠運行。

+0

如果是單核PC,我上面的代碼總是需要8秒才能完成。我對嗎?我不明白爲什麼「你的程序在任何計算機上運行大概2s」 – Yves

+0

是因爲我的功能是「睡眠」2秒,而不是做一些真正的任務? – Yves

+0

@Thomas「睡眠」不會忙於等待;當這個程序正在休眠時,讓其他程序運行在該核心上;否則你會浪費大量資源。想象一下,如果您的手機上的鬧鐘應用程序每當您安排了鬧鐘時,都會自行採用一個cpu核心。 –

0

線程分配給內核的方式是特定於實現的。絕不保證每個線程都被分配了不同的核心,即使有足夠的可用核心。

大多數JVM實際上會嘗試這樣做,但例如空閒 - 例如,睡覺 - 線程可以與其他線程共享一個核心。

如果你想找出核心的數量,你可以做

Runtime.getRuntime().availableProcessors(); 

,在Java RT可以設置成使用可用內核的數量較少。 This article討論瞭如何在Windows 7下更改JVM的處理器關聯性。

此外,超線程可能會使顯然可用的內核數增加一倍。

因此,在Java中沒有通用的,符合標準的方式來確定系統上的核心數量。

相關問題