2014-10-29 2 views
-2

Предположим, у нас есть коллекция фруктовых объектов.Соответствующий параллельный сбор для поиска первого события

Несколько потоков могут добавить/удалить из этой коллекции, а также типы фруктов могут появляться несколько раз:

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

Теперь система может обрабатывать различные типы фруктов в то же время, но это будет, если 2 резьба перерывом попробуйте и обработайте 2 объекта одного типа (например, 2 яблока).

Поэтому, когда поток пытается обработать текущие плоды (например, яблоко), необходимо проверить, что яблоко является первым яблоком в очереди. Если он стоит в очереди за другим яблоком, он должен подождать.

Я планировал использовать ConcurrentQueue, но я не вижу, как бы я сказал, что яблоко было первым в очереди в очереди?

Есть ли подходящая коллекция, которая поддерживает эту функциональность?

+1

Вы можете показать свою реализацию кода, чтобы мы могли лучше понять, что вы делаете или не делаете ..? – MethodMan

+0

Это буквально очередь строк или строки здесь представляют различные типы объектов в очереди? –

+2

Кроме того, что означает «обработка» плода? Какова задача ваших потоков? Пожалуйста, начните с однопоточного описания проблемы, которую вы решаете, * затем * вы можете описать, как вы хотите, чтобы работа была распределена между потоками (и, следовательно, какие характеристики вы хотите в типе коллекции). –

ответ

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 проверить набор и добавить фрукты в набор в один атомный режим. В противном случае это состояние гонки.