2013-12-12 18 views
2

我已經編寫了下面的簡單代碼,它應該在CPU內核上平均加載4個線程。但htop結果顯示,我有一個100%CPU佔用的線程和三個佔用25%CPU的線程。所以我懷疑,調用者線程可能有更多的CPU負載,我感到困惑。有人可以告訴我原因嗎?爲什麼這4個並行線程在CPU上的加載不均勻

#include <pthread.h> 
#include <stdio.h> 

void* print_ws(void* unused) 
{ 
    while(1) 
     fputc('W',stderr); 
    return NULL; 
}//print_xs 

void* print_zs(void* unused) 
{ 
    while(1) 
     fputc('Z',stderr); 
    return NULL; 
}//print_xs 

void* print_xs(void* unused) 
{ 
    while(1) 
     fputc('X',stderr); 
    return NULL; 
}//print_xs 

void* print_os(void* unused) 
{ 
    while(1)  
     fputc('O',stderr); 
    return NULL; 
} 

int main() 
{ 
    pthread_t t1, t2, t3; 
    // create a new thread. the new thread will run the print_xs 
    pthread_create(&t1, NULL, &print_zs, NULL); 
    pthread_create(&t2, NULL, &print_xs, NULL); 
    pthread_create(&t3, NULL, &print_ws, NULL); 
    print_os(NULL); 
return 0; 
}//main 
+1

如果你只是一個簡單的'替換每個'print_'程序的'fputc'電話會發生什麼;' - 也就是說,如果你將每個線程程序變成一個緊密的,硬編碼的,不可破解的循環?這將消除任何可能的鎖爭用。如果你嘗試這個,你可能只想爲你的初始測試啓動三個線程。分享並享受。 –

+0

在這裏很好地工作。會說我觀察到所有四個線程的負載均勻分佈。 – alk

回答

2

線程正在等待對libc中stderr的鎖定,或者它們都在競爭操作系統中的同一個鎖。等待鎖定的線程不會使用cpu。我很驚訝,但你有一個線程使用100%。他們應該都被卡在等待鎖或多或少地平等。

+0

正是我的問題是這是什麼。我用兩個線程做了測試。結果令人驚歎。兩個線程的CPU負載如下 'pid:17984 cpu_load:100' 'pid:17985 cpu_load:50' 所以這意味着孩子的負載小於父母。 我不明白原因。 – muradin

1

我猜他們可能會等待,以便在下一個線程得到執行的鎖拿開

相關問題