2014-02-18 1 views
2

나는 3 개의 스레드를 가진 프로그램을 가지고 있습니다. 이들 모두는 다른 포트의 이더넷에서 데이터를 가져옵니다. 스레드 3 개에 들어오는 데이터의 주파수는 다를 수 있습니다. 그러나 들어오는 모든 데이터는 동시에 처리되어야합니다.Qt의 스레드 동기화

하나의 스레드에 대해 하나의 데이터가 제공되면 다른 데이터가 오기를 기다려야합니다. 그것을 어떻게 얻을 수 있습니까?

+0

스레드 간 통신이 필요하며 대기 상태가 마음에 들었습니다. – 4pie0

답변

5

Boost.Thread는 barrier 클래스를 가지고 있습니다.이 클래스의 목적은 지정된 숫자가 장벽에 도달 할 때까지 여러 스레드를 차단하는 것입니다.

boost::barrier은 3으로 초기화됩니다. 즉, 3 개의 스레드가 장벽을 기다릴 때까지 차단됩니다. 각 스레드가 데이터 대기를 완료하면 장벽에 wait()이라고 부르게됩니다. 세 번째 스레드가 wait()을 호출하면 세 스레드가 모두 계속 실행됩니다.

boost::barrier barrier(3); 

void thread_function() 
{ 
    read_data(); 
    barrier.wait(); // Threads will block here until all three are ready. 
    process_data(); 
} 

하나의 스레드 만 데이터를 처리하도록하려는 경우 wait()의 반환 값을 확인할 수 있습니다. 함수는 장벽에있는 스레드 중 하나에 대해서만 true를 반환합니다.

0

장벽이 필요합니다. Barrier는 미리 설정된 용량 N을 가지며 N 번째가 도착할 때까지 N-1 개의 스레드를 차단합니다. N 번째가 도착하면 N 개의 모든 스레드가 동시에 해제됩니다.

불행하게도 Qt는 장벽에 대한 직접 지원이 없습니다, 그러나 여기 Qt는 프리미티브 사용하여 간단한 구현이 : @dauphic 응답으로 부스트의 장벽처럼 간단하지 https://stackoverflow.com/a/9639624/1854587

0

는, 그러나 이것은 사용, 혼자 Qt를 수행 할 수 있습니다 슬롯, 신호 및 네 번째 스레드의 다른 클래스

다른 스레드를 조정하는 별도의 스레드에서 클래스를 작성하면 네트워크 스레드가 데이터를 수신 할 때 '조정자'클래스에 신호를 보낼 수 있습니다. 이 코디네이터 클래스가 3 개의 네트워크 스레드 모두로부터 메시지를 수신하면 스레드는 해당 데이터를 처리하도록 신호를 보낼 수 있습니다.