2011-02-24 4 views
9

다중 스레드 응용 프로그램을 개발해야합니다. 여러 스레드가있을 경우 각 스레드는 사용자 지정 이벤트 로그를 생성하고 저장해야합니다 (microsoft MSMQ가 아닌).다중 생성자, 단일 소비자

대기열에서 로그 데이터를 읽고 로그 정보를 파일에 저장하는 특정 정보로 조작하는 또 다른 스레드가 있습니다. 기본적으로 여기서는 여러 개의 단일 생산자 패러다임을 구현합니다.

어떤 몸이라도 C++ 또는 C#으로 구현하는 방법을 제안 할 수 있습니다. 당신이 사용할 수있는

답변

8

이런 종류의 일이 BlockingCollection<T>System.Collections.Concurrent에 정의하여 아주 쉽게 할 수 있습니다 :

여기 개념에 대한 좋은 기사입니다.

BlockingCollection<LogRecord> LogQueue = new BlockingCollection<LogRecord>(); 

각 생산자가 큐에 항목을 추가합니다 :

while (!Shutdown) 
{ 
    LogRecord rec = CreateLogRecord(); // however that's done 
    LogQueue.Add(rec); 
} 

그리고 소비자가 비슷한 수행합니다

모든 스레드가 액세스 할 수 있도록

기본적으로, 당신은 당신의 대기열을 생성

while (!Shutdown) 
{ 
    LogRecord rec = LogQueue.Take(); 
    // process the record 
} 

기본적으로 BlockingCollectionConcurrentQueue<T>을 사용합니다. 그는 가게를 후원한다. ConcurrentQueue은 스레드 동기화를 처리하고 BlockingCollection은 항목을 가져 오는 동안 대기 중이 지 않은 대기를 수행합니다. 즉, 대기열에 항목이없는 경우 소비자가 Take이라고 호출하면 항목을 사용할 수있을 때까지 대기 중이 지 않은 시간 (잠자기/회전 없음)을 수행합니다.

+0

아마도 Onsumer가 추가 조건 인 while (! Shutdown || LogQueue. ())을 얻는 것이 유용 할 수 있습니다. C#으로 표현됨).또는 LogQueue에 중지 할 수있는 방법이있는 경우에만 사용하십시오. – glglgl

+1

생산자가 'CompleteAdding'을 호출 할 수 있습니다. 추가를 위해 컬렉션 완료를 표시합니다 (즉, 더 이상 항목을 추가 할 수 없음). 그러면 소비자는'while (LogQueue.TryTake (out rec, Timeout.Infinite)) '을 사용할 수 있습니다. 이는 콜렉션을 비우고 종료한다는 것을 의미합니다. 'TryTake'는 콜렉션이 추가를 위해 완료되고 큐가 비어 있으면'False'를 리턴합니다. –

+0

@JimMischel 소비자가 항목을 대기열에서 제외하고 일부 처리를 수행 한 후 호출 프로세스에 결과를 어떻게 반환 할 수 있습니까? – gdp

2

감사하는 synchronized queue 새로운 ConcurrentQueue<T>을 더 나은 또는 (당신은 .NET 3.5 이상 코드가있는 경우)!

+0

감사합니다, 여기에 이벤트 로그를 생성하는 방법 .... –

1

다중 생성자, 단일 소비자는 다중 스레드 큐 통신에 대해 가장 쉬운 시나리오입니다. 스레드 큐는 조건 변수/뮤텍스와 std :: queue (큐 전체를 처리하려는 경우 cv 추가)의 조합으로 구현할 수 있습니다.

대기열이 비어있는 동안 소비자는 대기열에서 대기합니다. 생산자는 대기열에 추가 할 때 신호를 보냅니다 (전송 중).

1

당신이 계획하고있는 것은 고전적인 생산자 소비자 대기열이며 스레드는 작업을하기 위해 대기열의 항목을 소비합니다. 이것은 "액터 (actor)"또는 "활성 객체 (active object)"라고 불리는 더 높은 레벨의 구조체입니다.

기본적으로이 클래스는 항목을 소비하는 스레드와 대기열을 단일 클래스로 래핑하고 다른 클래스는이 클래스의 모든 비동기 메소드를 호출하여 메시지를 액터의 스레드가 수행 할 대기열에 넣습니다. 귀하의 경우 클래스는 데이터를 대기열에 저장하는 단일 메소드 writeData를 가질 수 있으며 조건 변수를 트리거하여 액터 스레드에 대기열에있는 것이 있음을 알립니다. 액터 스레드는 조건 변수를 기다리지 않으면 대기열에 데이터가 있는지 확인합니다.

http://www.drdobbs.com/go-parallel/article/showArticle.jhtml;jsessionid=UTEXJOTLP0YDNQE1GHPSKH4ATMY32JVN?articleID=225700095

관련 문제