2014-10-29 56 views
-2

假設我們有一個水果對象的集合。找到第一個匹配項的合適的同時收集

多個線程可以添加/從這個集合中刪除,並種水果可以出現多次:

"apple", "pear", "orange", "pear", "apple" 

目前,該系統可以同時處理不同的水果種類,但它會打破,如果2個線程嘗試並處理2個相同類型的對象(例如2個蘋果)。

所以當一個線程試圖處理它的當前水果(即蘋果)時,它需要檢查蘋果是隊列中的第一個蘋果。如果它排在另一個蘋果之後,它應該等待。

我打算使用ConcurrentQueue,但我看不出我該如何判斷蘋果是否是隊列中的第一次出現?

是否有支持此功能的合適集合?

+1

你可以展示你的代碼實現,以便我們可以更好地理解你在做什麼或者不在做什麼..? – MethodMan 2014-10-29 20:33:22

+0

這是字面上的字符串隊列還是字符串在這裏表示隊列中的各種類型的對象? – 2014-10-29 20:34:53

+2

另外,「處理」水果是什麼意思?你的線程完成什麼任務?請首先對您正在解決的問題進行單線程描述,然後您可以描述您希望在線程間分配工作的方式(以及因此在集合類型中需要哪些特徵)。 – 2014-10-29 20:37:17

回答

1

你應該跟蹤當前處理的水果。

HashSet<string> _inProcess = new HashSet<string>(); 

bool CanProcessFruit(string fruit) 
{ 
    lock(_inProcess) 
    { 
     if(_inProcess.Contains(fruit)) 
      return false; 
     _inProcess.Add(fruit); 
     return true; 
    } 
} 

void EndProcessFruit(string fruit) 
{ 
     lock(_inProcess) 
     { 
      _inProcess.Remove(fruit); 
     } 
} 

請注意,我使用HashSet並自己鎖定而不是ConcurrentDictionary。這是因爲我想要CanProcessFruit檢查集合並在一個原子操作中將水果添加到集合中。否則,這是一種競爭條件。

相關問題