2013-03-01 69 views
2

此代碼片段從ConcurrentQueue執行從here給出。鎖定免費併發隊列

internal bool TryPeek(out T result) 
{ 
    result = default(T); 
    int lowLocal = Low; 
    if (lowLocal > High) 
     return false; 
    SpinWait spin = new SpinWait(); 
    while (m_state[lowLocal] == 0) 
    { 
     spin.SpinOnce(); 
    } 
    result = m_array[lowLocal]; 
    return true; 
} 

它真的是無鎖而不旋轉嗎?

+4

紡紗未鎖定。你認爲哪裏鎖定? – 2013-03-01 18:26:17

+2

微軟大聲笑 – 2013-03-01 18:27:21

+0

@ChristianStewart Aww,應該留下 - 給它一個很好的規範。 :) – JerKimball 2013-03-01 18:29:15

回答

4

紡紗是鎖。這在MSDNWikipedia和許多其他資源中都有說明。 這不是關於單詞。無鎖是一種保證。這並不意味着代碼不應該使用鎖定語句。如果保證系統範圍的進展,算法是lock-free。我沒有看到此代碼和使用鎖的代碼之間的任何區別。唯一的區別是旋轉使用繁忙的等待和線程屈服,而不是將線程置於睡眠模式。 我不明白這是如何保證系統級進程的,所以我個人認爲這不是無鎖實現。至少不是這個功能。

+1

無鎖並不能保證系統的進展;這是免費的。無鎖說,至少有一個線程會提前,而不管其他人。 – 2016-10-08 20:38:44

3

無鎖意味着不使用鎖。自旋等待不鎖定。有許多方法可以在不使用鎖的情況下同步對數據的訪問。執行旋轉等待是一個(很多)選項。並非所有的無鎖代碼都會使用自旋等待。

+2

不,它沒有。無鎖意味着保證全系統的進展。調用此函數的10個線程在狀態未設置時將不會執行任何進度。你甚至可能在這裏住鎖。無鎖算法中不能同時存在死鎖和活鎖,這就是無鎖保證的全部要點。 – axe 2013-03-01 19:42:11

2

紡紗將CPU置於一個緊密的循環中,而不會使其當前處理器的剩餘時間減少,從而避免用戶提供的循環可能產生的問題。如果知道狀態改變即將發生,這可能很有用。這對於普通代碼來說是最好的選擇,並且代表替代來鎖定這種特殊情況。

所以是的,因爲在.NET Framework中使用了術語鎖,因此代碼是無鎖的。

http://msdn.microsoft.com/en-us/library/hh228603.aspx