qwaitcondition 예제

이 예제에 제시된 생산자-소비자 모델을 사용하면 매우 동시다영적인 다중 스레드 응용 프로그램을 작성할 수 있습니다. 다중 프로세서 컴퓨터에서 프로그램은 버퍼의 다른 부분에서 동시에 두 스레드를 활성화할 수 있기 때문에 동등한 뮤텍스 기반 프로그램보다 최대 두 배 빠릅니다. 사용자가 종료를 클릭하거나 창을 닫으면 실행 중인 스레드가 중지되고 QCloseEvent::accept()라고 부르기 전에 실행 중인 스레드가 완료될 때까지 기다립니다(QThread::wait()). 이렇게 하면 이 예제에서는 실제로 중요하지 는 않지만 응용 프로그램이 깨끗한 상태로 종료됩니다. 세 스레드가 깨어나는 순서는 정의되지 않습니다. 또한 키를 누를 때 일부 스레드가 do_something()에 있는 경우 조건 변수를 기다리지 않으므로 잠에서 깨어날 수 없으므로 해당 키 누에 대해 작업이 수행되지 않습니다. 이 문제는 카운터와 QMutex를 사용하여 해결할 수 있습니다. 예를 들어, 작업자 스레드에 대한 새 코드는 다음과 같습니다: 스레드의 목적은 코드를 병렬로 실행할 수 있도록 하는 것이지만 스레드가 중지되고 다른 스레드를 기다려야 하는 경우가 있습니다. 예를 들어 두 스레드가 동일한 변수에 동시에 쓰려고 하면 결과가 정의되지 않습니다. 스레드가 서로를 기다리도록 강요하는 원칙을 상호 배제라고 합니다.

데이터와 같은 공유 리소스를 보호하는 일반적인 기술입니다. Qt는 스레드 동기화를 위한 상위 수준 메커니즘뿐만 아니라 하위 수준 프리미티브를 제공합니다. 멀티 스레딩은 주제에 전념 많은 책과 함께 큰 주제입니다, 예를 들어, 스레드 프라이머: 빌 루이스와 다니엘 J. 버그에 의해 멀티 스레드 프로그래밍 가이드 (프렌티스 홀, 1995) 및 그레고리에 의해 멀티 스레드, 병렬 및 분산 프로그래밍 앤드류스 (애디슨 웨슬리, 2000). 여기서는 다중 스레드 프로그래밍의 기본 을 이미 이해하고 있다고 가정하므로 스레딩 자체가 아닌 다중 스레드 Qt 응용 프로그램을 개발하는 방법을 설명하는 데 중점을 둡니다. 이 예제에서는 생산자와 소비자의 두 클래스로 구성됩니다. 둘 다 QThread에서 상속됩니다. 이러한 두 클래스와 이를 보호하는 동기화 도구 간의 통신에 사용되는 순환 버퍼는 전역 변수입니다. 예를 들어 사용자가 키를 누를 때마다 수행해야 하는 세 가지 작업이 있다고 가정해 보겠습니다. 각 작업은 스레드로 분할 될 수 있습니다., 각 run() 본문이 있을 것 이다: 실제로 작업 예제 를 얻으려면 외부에서 처리 취소 같은 더 많은 논리를 추가할 수 있습니다., 큐의 공허에 대 한 알림 및 항목에 대 한 일부 메모리 관리 T*를 입력합니다.

QWaitCondition 예제와 마찬가지로 다음과 같이 생산자-소비자 예제를 다시 작성합니다. 예제를 가능한 한 단순하게 유지하기 위해 예제를 상수로 만듭니다. 버퍼크기는 원형 버퍼의 크기입니다. DataSize보다 작기 때문에 어느 시점에서 생산자가 버퍼의 끝에 도달하여 처음부터 다시 시작됩니다. stop() 함수는 중지된 변수를 true로 설정하여 run()을 지시하여 콘솔에 텍스트 인쇄를 중지합니다. 이 함수는 언제든지 모든 스레드에서 호출할 수 있습니다. 이 예제에서는 bool에 할당하는 것이 원자성 작업이라고 가정합니다. 이것은 bool이 두 개의 상태만 가질 수 있다는 점을 고려하면 합리적인 가정입니다. 이 섹션의 후반부에서는 QMutex를 사용하여 변수에 할당하는 것이 원자성 작업임을 보장하는 방법을 살펴보겠습니다. GitHub의 Xpiks에서 사용되는 생산자-소비자 구현의 전체 예제를 확인할 수 있습니다.

뭔가 명확하지 않은 경우에 언제든지 질문을 주시기 바랍니다.