2016-07-26 48 views
3

我想在用信號量定義最大大小時創建隊列。爲什麼我需要使用帶信號量的鎖

Enque將增加項目和deque將刪除項目

public void Enque(T item) 
    { 
     semaphore.WaitOne(); 
     privateQueue.Enqueue(item); 

在谷歌上搜索類似的情況,我發現,有時候鎖用於 這樣

semaphore.WaitOne(); 
lock(lock) 
privateQueue.Enqueue(item); 

爲什麼我們需要加一把鎖信號? 謝謝

+0

編寫線程安全代碼是* hard *。關於這個主題的一些精彩的書籍:「Windows上的併發編程」,「實踐中的Java併發」(與C#開發人員驚人地相關,提供您知道如何匹配API) –

+0

Semaphore的初始化是什麼?如果它是「新的信號量(0,1)」,那麼你可能不需要使用鎖,因爲使用這樣的信號量將只允許一個線程訪問資源。 –

回答

1

如果您的信號量允許併發訪問隊列(通過允許最大計數> 1),則排隊和出隊必須以線程安全的方式完成。

或者,您可以使用已經線程安全的隊列,例如ConcurrentQueue<T>,然後您不需要鎖定 - 只要鎖僅保護隊列本身。如果鎖包含更多的內容(很難從你的問題中的代碼片段中說出),那麼無論如何你都可能需要它。

相關問題