2014-10-29 4 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에서 세트를 확인하고 과일을 하나의 원자 적 조작으로 세트에 추가하기를 원하기 때문입니다. 그렇지 않으면 경쟁 조건입니다.

관련 문제