2011-01-20 35 views
4

在處理器使用情況方面,以下代碼段之間是否存在差異?C:線程semaphore_wait vs while循環

void *ManageSequencer(void *argument){ 
    SomeClass *someClass = (SomeClass *)argument; 

    while (someClass->ThreadIsAlive()) { 

    while(someClass->isAsleep) { } 

    someClass->isAsleep = true; 

    //thread execution statements 

    } 
    return argument; 
} 

其中一些類定期設置isAsleep=false時,它需要的線程來執行

OR

void *ManageSequencer(void *argument){ 
    SomeClass *someClass = (SomeClass *)argument; 

    while (someClass->ThreadIsAlive()) { 

    semaphore_wait(sem); 

    //thread execution statements 

    } 
    return argument; 
} 

週期時,它需要的線程來執行,其中SomeClass的要求semaphore_signal(sem);

這個問題不是關於原子性,只是while循環是否會導致處理器比信號量解決方案更有效。信號量是否有一個內部的while循環,阻塞直到滿足條件(信號量增加到零以上)?

回答

3

是的,第一個會使處理器比第二個處理器工作得多。基本上,每當第一個示例中的活動線程被調度時,它就會消耗所有處理器時間,直到調度程序搶佔它並給出另一個線程時間。這意味着你有上下文切換,並且線程的整個(可能)時間片每次都被100%使用,並且它實際上不起作用。

第二個例子會將線程捕獲到內核中,所以在內核獲取信號並恢復線程之前,它將不會獲得任何處理器時間。一旦發生這種情況,調度程序會再次給它處理時間,但現在我們知道它有實際的工作要做,而不是僅僅使用與CPU掛鉤的整個時間片。

2

一個典型的信號量實現將「駐留」在內核中的線程,因此它不使用處理器時間。強烈推薦這個原因:)

(同樣,大多數互斥實現將做到這一點,但自旋鎖不會)

2

你的第一個例子是要忙旋外循環時,someClass->isAsleep是假的。即它將花費所有的處理器時間而無所事事。

你的第二個例子將睡眠在信號量上,而不是花費CPU時間。 也就是說第一起案件非常非常糟糕,第二起案件很好。