我有一個Queue<T> _q = new Queue<T>();
隊列<T>線程安全:一個作家,一個閱讀器
有永遠只有一個線程填充它:_q.Enqueue(msg);
有永遠只有一個線程消費它:_q.Dequeue();
我想在兩個線程中都是無鎖的。性能是重要的,但安全是第一位的。
我需要製作_q
a ConcurrentQueue<T>
?
UPD 這可能是重要的: 我並不需要確保編寫線程後立刻讀取線程將成功地出列項排入它。如果幾個false
出隊將被採取 - 沒關係。
我有一個Queue<T> _q = new Queue<T>();
隊列<T>線程安全:一個作家,一個閱讀器
有永遠只有一個線程填充它:_q.Enqueue(msg);
有永遠只有一個線程消費它:_q.Dequeue();
我想在兩個線程中都是無鎖的。性能是重要的,但安全是第一位的。
我需要製作_q
a ConcurrentQueue<T>
?
UPD 這可能是重要的: 我並不需要確保編寫線程後立刻讀取線程將成功地出列項排入它。如果幾個false
出隊將被採取 - 沒關係。
在這裏您可以找到一個免鎖隊列:Lockfreie threadsichere Queue - 不要害怕德國的網站 - 代碼應該說明問題。此外,還有另一篇更深入的文章Writing Lock-Free Code: A Corrected Queue
您也可以使用syncQueue = Queue.Synchronized(_q);
,儘管它在內部使用鎖定。
它爲什麼需要無鎖定? ConcurrentQueue使用鎖(你不需要自己處理的鎖),並使用旋轉(我認爲)然後嘗試訪問隊列。 –
你對'ConcurrentQueue'說得對。它使用旋轉,這是一種鎖。但我認爲它比'lock(_q){...}'更好。不使用鎖的主要原因是性能。寫作線程不得在途中遇到某人的鎖。這是一個服務器 – astef
你當然可以建立一個具有這種性能的隊列。只要在「前」索引更新之前將項目插入到單個生產者的隊列存儲中,單個使用者就不能接受錯誤條目。 'Queue'是否有這樣的保證是另一回事。 –