2013-02-28 54 views
1

我最近在課堂上了解到同步,我對信號和廣播之間的區別有些困惑。我知道信號,當它發生時,它喚醒了等待列表中的第一個線程。該線程將在信號線程解鎖後聲稱鎖定。那麼廣播會發生什麼?當廣播被調用時,所有等待的線程都被喚醒。然後當廣播線程解鎖時,這些線程中的哪一個會獲取該鎖?同步,鎖定與廣播傳遞

回答

1

所有線程都暢通無阻。他們都試圖獲得鎖定。首先成功的人將從其持有該鎖的wait函數返回。當該線程稍後釋放該鎖時,其中一個線程仍然嘗試獲取該鎖,將會獲得該鎖。

在實踐中我懷疑,在廣播的OS將移動候補名單直接穿過,並把它添加到等待獲取鎖(佔優先,如果它通過優先順序,這樣的列表)線程的列表。但是這是一個實現細節。

+0

查詢:對於一個信號操作系統解鎖一個等待'cond'的線程。如果該線程不鎖定'mutex',該怎麼辦?操作系統是否會阻止另一個也在隊列中等待的線程? – SparKot 2013-02-28 11:26:33

+0

@DoSparKot:除非我誤解了你,否則你所描述的情況不會出現,除非線程異步死亡。所有用於等待條件變量的函數都會在持有互斥體的情況下退出,所以如果沒有先取得互斥體,線程就無法做任何事情。如果線程被解除阻塞然後被終止,OS將不會喚醒其他線程。條件變量的信號實際上將丟失。這是殺死線程可能導致代碼難以正確執行的幾個原因之一。 – 2013-03-02 17:44:25