操作如果隊列syncronized:隊列同步化,並在C#
var _item = Queue.Synchronized(new Queue());
我可以打電話給喜歡加入和離開隊列它的方法,而無需使用鎖語句?
我當前的代碼是:
lock (_item.SyncRoot)
{
_item.Enqueue(obj);
}
我可以線程安全地使用:
_item.Enqueue(obj);
var item = _item.Dequeue();
操作如果隊列syncronized:隊列同步化,並在C#
var _item = Queue.Synchronized(new Queue());
我可以打電話給喜歡加入和離開隊列它的方法,而無需使用鎖語句?
我當前的代碼是:
lock (_item.SyncRoot)
{
_item.Enqueue(obj);
}
我可以線程安全地使用:
_item.Enqueue(obj);
var item = _item.Dequeue();
的呼叫Enqueue
和調用Dequeue
是線程安全的。
但是,您的示例代碼不是:
在呼叫Enqueue
和呼叫Dequeue
之間可能存在線程切換。這意味着item
可能是obj
之外的另一個實例,或者對Dequeue
的調用會引發異常,因爲它現在爲空。
爲了使您的示例代碼線程安全的,你仍然需要明確地鎖定:
lock(_item.SyncRoot)
{
_item.Enqueue(obj);
var item = _item.Dequeue);
}
只是現在得到了保證,這item
參考,等於在所有情況下obj
。
這幾乎是什麼SynchronizedQueue
做,但有一個問題......你通常需要檢查.Count
和一個.Dequeue()
原子單位 - 不檢查.Count
(一個單元),然後.Dequeue()
(另一單位) - 一旦鎖定被投降,你不能相信.Count
,如果另一個線程盜取了工作,.Dequeue()
將拋出。
也許嘗試ConcurrentQueue<T>
在4.0(與.TryDequeue()
),或使用Queue<T>
和lock
。