2013-08-06 290 views
2

我在過去並沒有多線程併發的經驗,所以我需要一些幫助。多線程寫入,一個線程從隊列中讀取,線程安全

基本上,我擁有的是一個隊列(無論是通過DI框架還是通過靜態對象進行管理)。我也有多個線程需要寫入該隊列,但只有一個線程將會出隊。

由於我在線程安全方面略有缺乏經驗,我是否需要做一些具體的事情來確保某些東西不會意外地出錯?考慮到其中一個要求是排隊的對象按照它們被首先發送到排隊類的確切順序排列。

我認爲必須使用ConcurrentQueue是必須的嗎?或者我將不得不開始通過排隊和鎖定來實現自己的魔法?

+0

ConcurrentQueue或BlockingCollection。 –

回答

0

如果您使用ConcurrentQueue,關於排隊確實沒有太多額外的工作要做。除非你真的被迫,否則不要自己滾動,多線程是得到正確的,而根本沒有樂趣調試。

請記住,如果您有多個編寫器,則可能沒有嚴格的數據順序插入,即如果一個線程嘗試添加「A」並且一個線程嘗試添加「B」,則順序他們得到補充可能會因爲時間的微小變化而變得不同。

+0

好吧,這就是它開始變得有趣的地方 - 我需要將它們按照它們創建的特定順序插入(毫秒精度至少)。任何可能的解決方案? – NeroS

+0

@NeroS這將需要一些半高級同步(即線程需要等待插入,直到之前的線程__開始完成插入。)看起來[反應擴展](http://msdn.microsoft.com/en-us /data/gg577609.aspx)及其調度程序可能對您的問題有一個或多或少的開箱即用的解決方案,否則可能有點複雜。 –

+0

@NeroS - 使要求消失?爲什麼說你至少需要'毫秒精度',因爲你不會以任何可靠的方式在桌面操作系統上獲得它。 –

0

ConcurrentQueue是一個很好的開始,也許你需要知道使它成爲現實。注意你的線程之間可能會共享的其他資源,這些資源需要鎖定或使用專門的併發類。