2012-02-06 99 views
2

通常所說的信號量......它們是否涉及到忙碌的等待?我對這個術語感到困惑。請告訴我,我能夠畫出的哪些結論是真實的。 a)Spinlocks涉及繁忙的等待,所以爲了避免這種情況,我們有信號量。
b)信號量是一種自旋鎖,但我們可以沒有繁忙的等待信號量
c)pthread_condition變量與信號量做同樣的事情嗎?如果是這樣,它們是否等同於semaphore.h庫中的信號量。如果兩者都代表相同的功能,我很困惑。
信號量術語

回答

4

抽象地說,信號量是一個帶有許多許可證的鎖。信號燈支持兩種操作:

  1. 截至,增加許可的數量,並且
  2. ,它試圖減少許可證的數量。如果沒有足夠的許可證,則該操作等待,直到有足夠的許可證可用。

實現信號量有很多方法。但是,通常情況下,信號量不是作爲自旋鎖實現的,而是實際上讓操作系統阻塞線程並讓它休眠直到請求的許可證可用。也就是說,一個完全合法的信號量實現可能會讓它忙碌 - 等待;我只是沒有意識到任何這樣做的實現。

條件變量表示不同的概念。通常,信號燈旨在管理只有這麼多副本的資源。希望資源的每個線程都會等待,直到信號守護對它的訪問變得可用,並且每個使用資源的線程都擁有一個許可。條件變量通常用於允許線程等待某些事件發生。他們通常支持業務

  1. 等待,這阻止線程,直到它發出信號,
  2. 通知,它講述了一個線程等待條件變量,它可以繼續,並
  3. 通知 - 全部,它告訴等待條件變量的所有線程可以繼續。

條件變量和信號可以(通常)互換使用,並對鎖的使用設計進行適當的更改。但是,有時信號量更容易處理,有時條件變量更容易處理,所以我們都有可用的基元。通常情況下,由於您使用的特定庫或語言,您會選擇使用一種。例如,Java對象內置支持監視器(與鎖配對的條件變量),所以在Java中使用條件變量通常很有用,儘管Java信號量確實存在。如果您在Windows中進行編程,則信號量是首選的同步方法,但條件變量確實存在。

希望這會有所幫助!

+0

是的,所以我想知道如果你能給我的例子,以對比我可以使用它們 – 2012-02-06 03:58:13

+0

加上這個..我認爲你的解釋幫助。 http://stackoverflow.com/questions/3513045/conditional-variable-vs-semaphore – 2012-02-06 04:02:49

+0

POSIX符合性信號量不能等待,至少在實現支持優先級調度選項時不能等待,因爲這樣做會阻止低級別信號量的前進,優先級線程。 – 2012-02-06 04:33:19

0

自旋鎖使用繁忙的等待,因此名稱自旋 - 線程自旋無所事事。

它所做的是「?我可以去我可以去我可以進去......等」,直到鎖允許它在關鍵部分(CS)

信號燈:通常使用信號/通知和隊列來實現,因此當線程在信號量上進入睡眠狀態時,如果臨界區域中有另一個線程,則進入隊列。如果CS中沒有其他線程,則當前線程輸入它。當另一個線程在CS中時,所有其他線程在信號量上進入隊列。當第一個線程退出CS時,它會再次觸發信號量。信號量現在將其隊列中的第一個線程喚醒並喚醒它,從而使線程進入CS。

在signal/wait實現的信號量時,線程說我可以進去嗎?如果不是,它說,當我可以時叫醒我。如果是的話,它會在

編輯:信號燈VS條件

上條件的等待和信號操作是非常相似的P和V操作上計數信號。等待語句可以阻塞線程的執行,而信號語句可以導致重新啓動另一個線程。但是,它們之間存在差異。 P操作不一定會阻塞一個線程,因爲信號量計數器可能大於零。然而,等待語句總是阻塞一個線程。信號語句可以在一個條件下準備好(解除阻塞)阻塞的線程,就像V操作爲信號量上的阻塞線程做好準備一樣。區別在於V操作總是增加信號量計數器;從而影響後續的P操作。空條件下的信號語句不會影響後續的等待語句,因此會丟失。另一個區別是,如果執行足夠的V操作,信號量上被阻塞的多個線程可以立即恢復執行。在互斥類型的情況下,多個信號語句可以解鎖多個線程,但由於互斥類型的互斥屬性,只能有一個線程能夠執行。

+0

請解釋與cond vars的對比 – 2012-02-06 03:56:44