2015-01-20 2 views
1

I는 다음과 같습니다 간단한 설문 조사 프로세스 루프 병렬화에 직면하고 있습니다 : 문제가 발생 된 항목을 제외하고 단일 생산자/다중 소비자 패턴을 다음과 싱글 프로듀서, 여러 소비자 아키텍처

while(!done) 
    buffer = poll(...) 
    foreach(item i in buffer) 
     process(i) 
소비 할 필요가

을 by 모두 소비자.

구현이 멀티 스레드 C++ 코드 여야한다는 것을 고려하면 어떤 종류의 데이터 구조를 사용해야합니까?

귀하의 조언에 감사드립니다.

+2

을 추가 할 때이 재 할당 할 수 있기 때문에

는 벡터에 대한 액세스를 동기화하는 것을 잊지 마십시오. 자물쇠가없는 솔루션을 찾고 있습니까 (자물쇠없는 솔루션이 무엇인지 알고 있습니까)? 가능하면 –

+0

예. 모든 소비자가 생산 한 모든 것을 소비하는 다수의 소비자를 갖게되면 저를 곤란하게 만듭니다. 당연히 소비자에게 버퍼를 복사하지 않아야합니다. – NrubDub

+0

하지만 왜 잠금이 필요하지 않습니까? –

답변

0

Si 가장 좋은 방법은 각 소비자에 대한 메시지 대기열을 만드는 것입니다.

이것은 모든 소비자가 생산자에 등록해야한다는 것을 의미하며 생산자는 각 메시지 대기열에 메시지를 대기시켜야합니다.

좋은 구현 옵션은 제작자와 소비자간에 프록시 개체를 만드는 것이어야합니다. 프록시 개체는 하이브리드 개체이므로 제작자의 모든 메시지를 소비하지만 모든 등록 된 소비자에게 전달합니다. .

+1

나는 그 일을 할 수있을 것 같아요, 버퍼는 포인터/참조 횟수 또는 shared_ptr 액세스 평생을 제어 할 수 있습니다. –

+0

@MartinJames +1 댓글 –

1

미리 소비자 수를 알고있는 경우 소비자 당 대기열을 사용할 수 있습니다.

소비자가 동적으로 추가되고 제거되는 경우 소비자 생성 전에 생성 된 메시지를 어떻게 처리할지 결정해야합니다. 모든 소비자가 모든 메시지를 처리해야하는 경우 - 벡터를 사용하여 모든 메시지를 보관하고 각 소비자가 서버에서 마지막으로 처리 된 메시지의 인덱스 만 유지하도록합니다. 생산자는이 잠금 무료로 태그 한 항목

관련 문제