문제

를 쓰고 있는 응용 프로그램은 여러 프로듀서,하나의 소비자 모델(다중 스레드에게 메시지를 보내는 단일 파일의 작가가 실).

각 프로듀서 스레드가 포함되어 두 가지 큐,하나의 작성,그리고 중 하나에 대한 소비자를 읽습니다.모든 루프의 소비자 thread,그것을 반복하여 각 프로듀서와 잠금는 생산자의 뮤텍스 스왑 큐,잠금 해제,고를 기록 큐에서는 생산자는 더 이상 사용합니다.

에서 소비자의 반복,그것은 자에 대한 후 일정 시간이 지나면 그것은 모두 처리하고 프로듀서 스레드입니다.하나는 일은 내가 즉시 발견했다는 평균의 시간 프로듀서 뭔가를 작성하는 큐로 돌아와 극적으로 증가(에 의해 5 배)이동할 때 나는 1 에서 프로듀서 스레드 2.으로 많은 스레드를 추가,이러한 평균 시간은 감소될 때까지 그것은 바닥에 있지 않는 많은 시간 간의 차이와 함께 찍은 10 생산자에 대 15 다.이것은 아마도 때문에 더 많은 생산 프로세스,미만일 경합을 위해 프로듀서 쓰레드의 mutex.

불행하게도,가 < 5 는 생산자는 매우 일반적인 시나리오에 대한 응용 프로그램고 싶을 최적화하는 수면 시간을 얻을 수 있도록 합리적인 성능에 관계없이 많은 생산자가 존재합니다.것으로 나타났으로 증가하는 수면 시간을,내가 얻을 수 있습니다 더 나은 성능을 저렴한 생산자의 수는,하지만 더 나쁜 성능한 대형 프로듀서 계산합니다.

는 다른 사람이고,만약 그렇다면 무엇이었을 솔루션?내가 노력 조정 수면 시간과 쓰레드의 수 있지만,그것은 다소 기계는 특정 및 예쁜 시험과 오류가 있습니다.

도움이 되었습니까?

해결책

당신이 선택할 수 있는 잠시의 수에 따라 생산자 또는 수면시간에 적응에 따라 일부 dyanmic 체계입니다.소비자가 깨어나고 없는 작품,더블 잠자기 시간,그렇지 않으면 절반으로 줄이다.그러나 제한하는 잠시간의 최소 및 최대.

어느 방법으로 당신이 배를 통해 더 근본적인 문제입니다.자고 투표하기 쉽고 때때로만 접근할 수 있지만,그것은 많은 단점이 있고 없는"오른쪽"방법입니다.

당신은 머리 수 있습니다 올바른 방향으로 추가하여 세마포어는 증가될 때마다 생산자가 항목을 추가 큐 및 감소할 때 소비자는 프로세스는 항목에서 큐가 있습니다.소비자가만이 깨어있을 때의 항목하는 과정이라는 즉시 그렇게 하십시오.

투표 큐가 있을 수 있습니다 여전히 문제,하지만.을 추가할 수 있습니다 새로운 큐를 참조하는 모든 큐가 있는 항목에습니다.하지만 그것은 오히려 질문을하지 않는 이유는 하나의 큐 소비자 프로세스를 보다는 오히려 큐당 생산자이다.는 그 밖의 모든 사항이 동일한 경우처럼 들리는 가장 좋은 방법입니다.

다른 팁

대신 자는,내가는 것이 좋습니다 당신의 소비자에 차단하는 조건에 의해 신호가 생산자입니다.에 posix 호환 시스템을 만들 수 있으로 작동하 pthread_cond.을 만들의 배열 pthread_cond_t, 각 프로듀서,다음을 추가로 만들 중 하나 사이에 공유되는니다.생산자는 먼저 신호의 개별적인 조건 변수,그리고 다음의 공유 하나입니다.소비자가 대기에서의 공동 조건과 반복을 통해 배열의 요소,수행 pthread_cond_timed_wait() 의 각 요소에 대해 배열(사용 pthread_get_expiration_np() 을 얻을 절대 시간에 대한"now").는 경우 0 을 반환합니다,그는 생산자가 작성된 데이터입니다.소비자는 다시 초기화해야 합니다 조건 변수하기 전에 기다리고 다시.

를 사용하여 차단기,당신은 금액을 최소화 하는 시간을 소비자가 불필요하게 잠-out 생산자입니다.당신은 또한이 세마포로에서 이전의 대답이다.세마포어는 단순화된 의미를 비교하는 조건에서,내 생각,그러나 당신이해야 할 것이 조심을 감소하는 공동 세마포어를 한 번에 대한 각 프로듀서로 처리된 각 패스에서 소비자를 통해 반복입니다.상태 변수가 있는 장점을 수 있습니다 기본적으로 그들을 사용하는 다음과 같 boolean 세마포어는 경우에 당신은 다시 그 후 그들은 신호.

을 찾아보십시오의 구현을 차단하는 큐에서 사용하는 언어를 위한 프로그래밍입니다.더 이상 하나의 큐에 충분의 수에 대한 생산자와 한 명의 사용자가 있습니다.

나에게 그것을 소리처럼 당신은 실수로 버퍼링을 소개함으로써 소비자 실 것 다른 곳 중 하나,자이나 실제 작동합니다.(큐 행동으로 버퍼)에 어쩌면 하는 몇 가지 간단한 버퍼링에는 프로듀서 측면을 줄일 것입니다 당신의 경쟁이 일어납니다.

그것을 보는 시스템에 매우 민감한 잠금 간의 경쟁이 생산자와 소비자,그러나 나는 당황한 이유 같은 간단한 스왑 작업을 차지하게 충분한 cpu 시간을 실행합니다.

보일 수 있는 일입니까?

편집:어쩌면 당신은 당신의 잠금 및 교환 큐가 없어도 작업을 할까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top