2011-04-26 13 views
3

我具有由各個線程訪問的Queue<T>字段。 Enequeue()從多個線程稱爲每秒多次,同時有一個線程執行Dequeue()Count操作。System.Collections.Queue <T>,線程,鎖定和同步

我還一直在想很多關於這個到現在爲止,因爲我打它的「安全」和之前與該隊列的任何操作靜態物體上使用lock。雖然目前沒有任何性能問題,但如果它們是多餘的,我想擺脫這些鎖。我的問題是:

  1. 因爲我永遠不會遍歷隊列,在這種情況下真的需要鎖嗎?我的意思是,當程序碰巧一個線程出現並且第二個線程同時在處出錯元素時程序會崩潰嗎?
  2. 應該我也許用Queue.Synchronized()得到的包裝,如果是這樣:會影響性能比原來的隊列?

回答

3

1:是的,他們是必要的;入隊和出隊變異狀態;一個標準的隊列是不是線程安全

2:ConcurrentQueue<T>將很好地工作;我個人使用的是我在SO上編寫的版本,Creating a blocking Queue<T> in .NET? - 它可以輕鬆節流隊列的大小,並且無需循環即可高效地出隊

注意;與你當前的實現鎖對象應該只是靜態,如果隊列是靜態的(這是不明確的問題,雖然) - 否則所有類似的隊列可能共享鎖

+0

感謝,'ConcurrentQueue '出現爲我工作的所有工作,沒有沉重的鎖。 – avance70 2011-04-26 12:53:54

+0

@ avance70 - 除非你已經進行了配置,否則我不會自動假設這裏的鎖是「沉重的」...... – 2011-04-26 13:09:57

+0

我認爲我的鎖很好地實現,隻影響到幾個必要的行。但是,正如你所建議的'ConcurrentQueue '我在某處讀到它使用'System.Threading.Interlocked'操作,它比'lock' – avance70 2011-04-26 13:21:49