2013-01-19 1 views
3

여러 제작자가 여러 소비자가 처리해야하는 데이터를 생성하는 프로그램을 작성 중입니다. 각 데이터의 소비에는 약 100ms가 걸리고 대상 플랫폼에는 많은 프로세서가 있기 때문에 각 생산자와 각 소비자가 고유 한 스레드를 얻는 것은 당연합니다. 제 질문은 : Qt 신호/슬롯은 생산자에서 소비자에게 데이터 블록을 전달하는 좋은 방법입니까? 또는 더 나은 솔루션을 제안 하시겠습니까 (Qt가 강력하게 권장됩니다).Qt 신호/슬롯을 가진 제작자/소비자

관련성이있는 경우 제작자는 1 시간마다 수십만 개의 데이터를 생성합니다.

+0

괜찮습니다. 그러나이 비디오를 보시고 특히 27 분 (크로스 스레드 신호 슬롯)부터 시작하십시오 : [Qt Developer Days 2011 - Multithreading] (http://qt-project.org/videos/watch/advanced-qt-a -deep-dive-3-6-multithreading-1) – leemes

답변

2

나는 각각의 신호가 모든 연결 슬롯을 분산되기 때문에 신호/슬롯 메커니즘, 여기에 적절한 생각하지 않습니다. 즉, 신호/슬롯 메커니즘을 '작업 대기열'로 사용하면 소비자에게 부하 분산이 발생하지 않고 모든 소비자가 동일한 (중복) 작업을 수행하게됩니다.

더 나은 메커니즘은 작업 대기열로 컨테이너를 사용하는 것입니다 (생산자가 항목을 컨테이너에 추가하고 소비자가 제거함). 동시 처리 문제를 피하기 위해 QMutex, 최대 크기를 부과하려는 경우) QWaitCondition은 소비자에게 작업이 없을 때이를 차단합니다.

+0

내 상황을 비추면, 이것이 최선의 선택이라고 생각합니다. 파이썬 표준 라이브러리처럼 Qt에서 쓰레드 안전 큐 클래스를 찾지 못한 것 같습니다. 그래서 뮤텍스와 대기 조건이 남아 있습니다. 끔찍하게 어렵지는 않지만 우리는 게으른 남자 야, 프로그래머! 더 나은 옵션을 알고 있다면 알려주십시오. 도와 줘서 고마워. – Elektito

+0

각 프로젝트마다 큐에 대한 요구 사항이 다르기 때문에 정말 일반적인 스레드 안전 큐를 작성할 수 있다고 생각하지 않습니다. 니가 필요로하는 것을 정확하게 써라. w.r.t. 후드 아래에 스레드로부터 안전하지 않은 컨테이너를 사용합니다. –

1

신호 및 슬롯은 이벤트로 작동하므로 신호가 방출되면 실행 제어가 없으므로 사용하지 않는 것이 좋습니다. 그래서, 나는 당신이 상호 배타에 대한 잠금 또는 mutexes (예 : QMutex)를 사용하는 것이 좋습니다. QMutex 클래스의 잠금 및 잠금 해제 방법을 사용하여 대기열을 보호하기 만하면됩니다. 나는 그것이 신호와 슬롯을 사용하는 것보다 빠르다고 생각한다. 왜냐하면 당신이 객체를 건네 주면 그것은 객체의 사본을 전달할 것이고 포인터를 전달할 경우에는 객체를 보호하지 않을 것이기 때문이다.

건배,