이 페이지에서

Qt의 멀티스레딩 기술

Qt는 스레드 작업을 위한 다양한 클래스와 함수를 제공합니다. 다음은 Qt 프로그래머가 멀티스레드 애플리케이션을 구현하는 데 사용할 수 있는 네 가지 서로 다른 접근 방식입니다.

QThread: 선택적 이벤트 루프를 지원하는 저수준 API

QThread 는 Qt의 모든 스레드 제어의 토대입니다. 각 QThread 인스턴스는 하나의 스레드를 나타내고 제어합니다.

QThread QThread 는 직접 인스턴스화하거나 서브클래스로 상속받을 수 있습니다. 를 인스턴스화하면 병렬 이벤트 루프가 제공되어, 슬롯이 보조 스레드에서 호출될 수 있습니다. 를 서브클래스로 상속받으면, 애플리케이션이 이벤트 루프를 시작하기 전에 새 스레드를 초기화하거나, 이벤트 루프 없이 병렬 코드를 실행할 수 있습니다. QObject QThread

` QThread class reference ` 및 스레딩 예제를 참조하여 ` QThread` 사용 방법을 확인해 보십시오.

QThreadPool 및 QRunnable: 스레드 재사용

스레드를 빈번하게 생성하고 소멸시키는 것은 성능에 부담을 줄 수 있습니다. 이러한 오버헤드를 줄이기 위해 기존 스레드를 새로운 작업에 재사용할 수 있습니다. ` QThreadPool `는 재사용 가능한 `QThread`들의 모음입니다.

QThreadPool 의 스레드 중 하나에서 코드를 실행하려면, QRunnable::run()을 재구현하고 서브클래스인 QRunnable 를 인스턴스화하십시오. QThreadPool::start()를 사용하여 QRunnable 를 QThreadPool 의 실행 대기열에 넣으십시오. 스레드가 사용 가능해지면, QRunnable::run() 내의 코드가 해당 스레드에서 실행됩니다.

각 Qt 애플리케이션에는 전역 스레드 풀이 있으며, 이는 ` QThreadPool::globalInstance()`를 통해 접근할 수 있습니다. 이 전역 스레드 풀은 CPU의 코어 수에 따라 최적의 스레드 수를 자동으로 유지합니다. 그러나 별도의 ` QThreadPool `를 생성하여 명시적으로 관리할 수도 있습니다.

Qt Concurrent: 고수준 API 사용

이 Qt Concurrent 이 모듈은 map, filter, reduce와 같은 일반적인 병렬 계산 패턴을 처리하는 고수준 함수들을 제공합니다. QThread 및 QRunnable 를 사용하는 것과는 달리, 이러한 함수들은 뮤텍스나 세마포어와 같은 저수준 스레딩 프리미티브를 전혀 사용할 필요가 없습니다. 대신, 이 함수들은 결과가 준비되면 결과를 가져오는 데 사용할 수 있는 ` QFuture ` 객체를 반환합니다. ` QFuture `를 사용하여 계산 진행 상황을 조회하거나 계산을 일시 중지/재개/취소할 수도 있습니다. 편의성을 위해 ` QFutureWatcher `는 시그널과 슬롯을 통해 ` QFuture`와의 상호작용을 지원합니다.

Qt Concurrent이 모듈의 map, filter 및 reduce 알고리즘은 사용 가능한 모든 프로세서 코어에 걸쳐 계산을 자동으로 분산하므로, 현재 작성된 애플리케이션은 향후 코어 수가 더 많은 시스템에 배포되더라도 계속해서 확장성을 유지할 수 있습니다.

또한 이 모듈은 다른 스레드에서 임의의 함수를 실행할 수 있는 ` QtConcurrent::run()` 함수를 제공합니다. 그러나 ` QtConcurrent::run()`는 `map`, `filter` 및 `reduce` 함수에서 사용할 수 있는 기능 중 일부만 지원합니다. QFuture 는 함수의 반환 값을 가져오고 스레드가 실행 중인지 확인하는 데 사용할 수 있습니다. 그러나 QtConcurrent::run() 호출은 단 하나의 스레드만 사용하며, 일시 중지/재개/취소가 불가능하고 진행 상황을 조회할 수도 없습니다.

개별 함수에 대한 자세한 내용은 Qt Concurrent 모듈 문서를 참조하십시오.

WorkerScript: QML에서의 스레딩

WorkerScript QML 유형을 사용하면 JavaScript 코드가 GUI 스레드와 병렬로 실행될 수 있습니다.

각 WorkerScript 인스턴스에는 하나의 .js 스크립트가 연결될 수 있습니다. WorkerScript.sendMessage()가 호출되면, 스크립트는 별도의 스레드(그리고 별도의 QML context)에서 실행됩니다. 스크립트 실행이 완료되면, GUI 스레드로 응답을 보낼 수 있으며, 이로 인해 WorkerScript.onMessage() 신호 핸들러가 호출됩니다.

WorkerScript 를 사용하는 것은 다른 스레드로 이동된 워커( QObject )를 사용하는 것과 유사합니다. 데이터는 신호를 통해 스레드 간에 전송됩니다.

스크립트 구현 방법에 대한 자세한 내용과 스레드 간에 전달할 수 있는 데이터 유형 목록은 WorkerScript 문서를 참조하십시오.

적절한 접근 방식 선택

위에서 살펴본 바와 같이, Qt는 스레드 기반 애플리케이션 개발을 위해 다양한 솔루션을 제공합니다. 특정 애플리케이션에 적합한 솔루션은 새 스레드의 목적과 스레드의 수명에 따라 달라집니다. 아래에서는 Qt의 스레딩 기술을 비교하고, 몇 가지 사용 사례에 대한 권장 솔루션을 제시합니다.

솔루션 비교

기능QThreadQRunnable 및 QThreadPoolQtConcurrent::run()Qt Concurrent (Map, Filter, Reduce)WorkerScript
언어C++C++C++C++QML
스레드 우선순위를 지정할 수 있습니다예예
스레드에서 이벤트 루프를 실행할 수 있음예
스레드는 시그널을 통해 데이터 업데이트를 수신할 수 있습니다예 ( QObject 에 의해 수신됨)예 ( WorkerScript 가 수신)
스레드는 시그널을 사용하여 제어할 수 있습니다예 ( QThread 에서 수신)예 ( QFutureWatcher 에서 수신)
스레드는 다음을 통해 모니터링할 수 있습니다. QFuture부분적으로예
일시 중지/재개/취소 기능이 내장되어 있음예

사용 사례 예시

스레드의 수명작업해결 방안
한 번의 호출다른 스레드 내에서 새로운 선형 함수를 실행하며, 실행 중에 진행 상황 업데이트를 선택적으로 수행할 수 있습니다.Qt는 다음과 같은 다양한 해결책을 제공합니다:
단일 호출다른 스레드 내에서 기존 함수를 실행하고 반환값을 가져옵니다.QtConcurrent::run()를 사용하여 함수를 실행합니다. 함수가 반환되면 QFutureWatcher 가 finished() 신호를 발산하도록 하고, QFutureWatcher::result()를 호출하여 함수의 반환값을 가져옵니다.
단일 호출사용 가능한 모든 코어를 사용하여 컨테이너의 모든 항목에 대해 연산을 수행합니다. 예를 들어, 이미지 목록에서 썸네일을 생성하는 경우입니다.Qt Concurrent 의 QtConcurrent::filter() 함수를 사용하여 컨테이너 요소를 선택하고, QtConcurrent::map() 함수를 사용하여 각 요소에 연산을 적용합니다. 출력을 단일 결과로 통합하려면 대신 QtConcurrent::filteredReduced() 및 QtConcurrent::mappedReduced()을 사용하십시오.
단일 호출/영구적순수 QML 애플리케이션에서 긴 계산을 수행하고, 결과가 준비되면 GUI를 업데이트합니다.계산 코드를 ` .js ` 스크립트에 넣고 이를 ` WorkerScript ` 인스턴스에 연결하십시오. ` WorkerScript.sendMessage()`를 호출하여 새 스레드에서 계산을 시작하십시오. 스크립트에서 `sendMessage()`도 호출하여 결과를 GUI 스레드로 다시 전달하도록 하십시오. ` onMessage `에서 결과를 처리하고 그곳에서 GUI를 업데이트하십시오.
영구적요청에 따라 다양한 작업을 수행하거나 처리할 새로운 데이터를 수신할 수 있는 객체를 다른 스레드에 상주시킵니다.QObject 를 상속하여 워커를 생성합니다. 이 워커 객체와 QThread 를 인스턴스화합니다. 워커를 새 스레드로 이동시킵니다. 큐에 저장된 시그널-슬롯 연결을 통해 워커 객체에 명령어나 데이터를 전송합니다.
영구적신호나 이벤트를 수신할 필요가 없는 다른 스레드에서 리소스 소모가 큰 작업을 반복적으로 수행합니다.QThread::run()의 재구현 내부에 무한 루프를 직접 작성합니다. 이벤트 루프 없이 스레드를 시작합니다. 스레드가 신호를 발생시켜 데이터를 GUI 스레드로 다시 전송하도록 합니다.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.