QThreadPool Class
QThreadPool 클래스는 QThread 모음을 관리합니다. 더 보기...
| 헤더: | #include <QThreadPool> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| 상속: | QObject |
- 상속된 멤버를 포함한 모든 멤버 목록
- QThreadPool은 스레딩 클래스의 일부입니다.
참고: 이 클래스의 모든 함수는 스레드 안전합니다.
속성
|
|
공개 함수
| QThreadPool(QObject *parent = nullptr) | |
| virtual | ~QThreadPool() |
| int | activeThreadCount() const |
| void | clear() |
(since 6.0) bool | contains(const QThread *thread) const |
| int | expiryTimeout() const |
| int | maxThreadCount() const |
| void | releaseThread() |
| void | reserveThread() |
(since 6.9) QThread::QualityOfService | serviceLevel() const |
| void | setExpiryTimeout(int expiryTimeout) |
| void | setMaxThreadCount(int maxThreadCount) |
(since 6.9) void | setServiceLevel(QThread::QualityOfService serviceLevel) |
| void | setStackSize(uint stackSize) |
| void | setThreadPriority(QThread::Priority priority) |
| uint | stackSize() const |
| void | start(QRunnable *runnable, int priority = 0) |
| void | start(Callable &&callableToRun, int priority = 0) |
(since 6.3) void | startOnReservedThread(QRunnable *runnable) |
(since 6.3) void | startOnReservedThread(Callable &&callableToRun) |
| QThread::Priority | threadPriority() const |
| bool | tryStart(QRunnable *runnable) |
| bool | tryStart(Callable &&callableToRun) |
| bool | tryTake(QRunnable *runnable) |
(since 6.8) bool | waitForDone(QDeadlineTimer deadline = QDeadlineTimer::Forever) |
| bool | waitForDone(int msecs) |
정적 공용 멤버
| QThreadPool * | globalInstance() |
상세 설명
QThreadPool은 스레드를 사용하는 프로그램에서 스레드 생성 비용을 줄이기 위해 개별 QThread 객체를 관리하고 재활용합니다. 각 Qt 애플리케이션에는 하나의 전역 QThreadPool 객체가 있으며, 이 객체는 globalInstance()를 호출하여 액세스할 수 있습니다.
QThreadPool 스레드 중 하나를 사용하려면 QRunnable 을 상속받은 서브클래스를 만들고 run() 가상 함수를 구현해야 합니다. 그런 다음 해당 클래스의 객체를 생성하여 QThreadPool::start()에 전달하면 됩니다.
class HelloWorldTask : public QRunnable
{
void run() override
{
qDebug() << "Hello world from thread" << QThread::currentThread();
}
};
int main()
{
//...
HelloWorldTask *hello = new HelloWorldTask();
// QThreadPool이 'hello'에 대한 소유권을 인수하고 자동으로 삭제합니다
QThreadPool::globalInstance()->start(hello);
//...
}QThreadPool은 기본적으로 QRunnable 를 자동으로 삭제합니다. 자동 삭제 플래그를 변경하려면 QRunnable::setAutoDelete()를 사용하십시오.
QThreadPool은 QRunnable::run() 내부에서 tryStart(this)를 호출하여 동일한 QRunnable 를 여러 번 실행할 수 있도록 지원합니다. autoDelete가 활성화된 경우, 마지막 스레드가 run 함수를 종료하면 QRunnable 가 삭제됩니다. autoDelete가 활성화된 상태에서 동일한 QRunnable 를 사용하여 start()를 여러 번 호출하면 경합 조건이 발생하므로 권장되지 않습니다.
일정 시간 동안 사용되지 않은 스레드는 만료됩니다. 기본 만료 타임아웃은 30000 밀리초(30초)입니다. 이 값은 setExpiryTimeout()를 사용하여 변경할 수 있습니다. 만료 타임아웃을 음수 값으로 설정하면 만료 메커니즘이 비활성화됩니다.
maxThreadCount()를 호출하여 사용 가능한 최대 스레드 수를 조회할 수 있습니다. 필요한 경우 setMaxThreadCount()를 사용하여 이 제한을 변경할 수 있습니다. maxThreadCount()의 기본값은 QThread::idealThreadCount()입니다. activeThreadCount() 함수는 현재 작업을 수행 중인 스레드 수를 반환합니다.
reserveThread() 함수는 외부 사용을 위해 스레드를 예약합니다. 스레드 사용이 끝나면 releaseThread()을 사용하여 스레드가 재사용될 수 있도록 하십시오. 기본적으로 이 함수들은 활성 스레드 수를 일시적으로 늘리거나 줄이며, QThreadPool에서 인식할 수 없는 시간이 오래 걸리는 작업을 구현할 때 유용합니다.
QThreadPool은 스레드 관리를 위한 저수준 클래스이므로, 더 높은 수준의 대안을 찾으려면 Qt Concurrent 모듈을 참조하십시오.
QRunnable도 참조하십시오 .
속성 설명서
[read-only] activeThreadCount : int
이 속성은 스레드 풀에 있는 활성 스레드의 수를 나타냅니다.
참고: 이 함수는 maxThreadCount()보다 큰 값을 반환할 수도있습니다 . 자세한 내용은 reserveThread()를 참조하십시오.
액세스 함수:
| int | activeThreadCount() const |
reserveThread() 및 releaseThread()도 참조하십시오 .
expiryTimeout : int
이 속성은 스레드 만료 타임아웃 값을 밀리초 단위로 저장합니다.
expiryTimeout 밀리초 동안 사용되지 않은 스레드는 만료된 것으로 간주되어 종료됩니다. 이러한 스레드는 필요에 따라 다시 시작됩니다. expiryTimeout 의 기본값은 30000밀리초(30초)입니다. expiryTimeout 가 음수인 경우, 새로 생성된 스레드는 만료되지 않으며, 예를 들어 스레드 풀이 소멸될 때까지 종료되지 않습니다.
expiryTimeout 을 설정해도 이미 실행 중인 스레드에는 영향을 미치지 않는다는 점에 유의하십시오. 새로 생성된 스레드만 새로운 expiryTimeout 을 사용합니다. 스레드 풀을 생성한 직후, start()를 호출하기 전에 expiryTimeout 을 설정하는 것이 좋습니다.
액세스 함수:
| int | expiryTimeout() const |
| void | setExpiryTimeout(int expiryTimeout) |
maxThreadCount : int
이 속성은 스레드 풀에서 사용하는 최대 스레드 수를 지정합니다. 이 속성의 기본값은 QThreadPool 객체가 생성되는 시점의 QThread::idealThreadCount() 함수의 반환값입니다.
참고: maxThreadCount 의 제한값이 0이거나 음수인 경우에도 스레드풀은 항상 최소 1개의 스레드를 사용합니다.
기본 maxThreadCount 는 QThread::idealThreadCount()입니다.
액세스 함수:
| int | maxThreadCount() const |
| void | setMaxThreadCount(int maxThreadCount) |
stackSize : uint
이 속성은 스레드 풀의 작업자 스레드에 대한 스택 크기를 지정합니다.
이 속성의 값은 스레드 풀이 새 스레드를 생성할 때만 사용됩니다. 이 값을 변경해도 이미 생성되었거나 실행 중인 스레드에는 아무런 영향이 없습니다.
기본값은 0이며, 이 경우 QThread 는 운영 체제의 기본 스택 크기를 사용합니다.
액세스 함수:
| uint | stackSize() const |
| void | setStackSize(uint stackSize) |
[since 6.2] threadPriority : QThread::Priority
이 속성은 새로 생성되는 작업자 스레드의 스레드 우선순위를 저장합니다.
이 속성의 값은 스레드 풀이 새 스레드를 시작할 때만 사용됩니다. 이 값을 변경해도 이미 실행 중인 스레드에는 아무런 영향이 없습니다.
기본값은 ` QThread::InheritPriority`이며, 이 경우 ` QThread `는 ` QThreadPool ` 객체가 속한 스레드 풀과 동일한 우선순위를 사용합니다.
이 열거형은 Qt 6.2에서 도입되었습니다.
액세스 함수:
| QThread::Priority | threadPriority() const |
| void | setThreadPriority(QThread::Priority priority) |
QThread::Priority도 참조하십시오 .
멤버 함수 문서
QThreadPool::QThreadPool(QObject *parent = nullptr)
지정된 ` parent`을 사용하여 스레드 풀을 생성합니다.
[virtual noexcept] QThreadPool::~QThreadPool()
QThreadPool 를 삭제합니다. 이 함수는 모든 실행 가능 객체가 완료될 때까지 대기합니다.
void QThreadPool::clear()
아직 시작되지 않은 실행 가능 객체를 대기열에서 제거합니다. runnable->autoDelete()가 true 를 반환하는 실행 가능 객체는 삭제됩니다.
start()도 참조하십시오 .
[since 6.0] bool QThreadPool::contains(const QThread *thread) const
thread 가 이 스레드 풀에서 관리하는 스레드인 경우 true 를 반환합니다.
이 함수는 Qt 6.0에서 도입되었습니다.
[static] QThreadPool *QThreadPool::globalInstance()
전역 ` QThreadPool ` 인스턴스를 반환합니다.
void QThreadPool::releaseThread()
reserveThread() 호출을 통해 이전에 예약된 스레드를 해제합니다.
참고: 미리 스레드를 예약하지 않은 상태에서 이 함수를호출하면 maxThreadCount()의 값이 일시적으로 증가합니다. 이는 스레드가 추가 작업을 기다리며 대기 상태에 들어갔을 때 다른 스레드가 계속 실행될 수 있도록 하는 데 유용합니다. 대기가 끝나면 reserveThread()을 반드시 호출하여 스레드 풀이 activeThreadCount()을 올바르게 유지할 수 있도록 해야 합니다.
reserveThread()도 참조하십시오 .
void QThreadPool::reserveThread()
activeThreadCount() 및 maxThreadCount()을 무시하고 스레드 하나를 예약합니다.
스레드 사용이 끝나면 releaseThread()를 호출하여 해당 스레드가 재사용될 수 있도록 하십시오.
참고: maxThreadCount() 스레드를 하나 이상예약하더라도 스레드 풀은 최소 한 개의 스레드를 계속 허용합니다.
참고: 이 함수는 보고되는 활성 스레드 수를 증가시킵니다. 즉, 이 함수를 사용하면 activeThreadCount()이 maxThreadCount()보다 큰 값을 반환할 수 있습니다.
releaseThread()도 참조하십시오 .
[since 6.9] QThread::QualityOfService QThreadPool::serviceLevel() const
스레드의 현재 서비스 품질(QoS) 수준을 반환합니다.
이 함수는 Qt 6.9에서 도입되었습니다.
setServiceLevel() 및 QThread::serviceLevel()도 참조하십시오 .
[since 6.9] void QThreadPool::setServiceLevel(QThread::QualityOfService serviceLevel)
이 세터 호출 후 생성되는 스레드 객체의 서비스 품질(QoS) 수준을 ` serviceLevel`로 설정합니다.
모든 플랫폼에서 지원되는 것은 아닙니다. 자세한 내용은 QThread::setServiceLevel()을 참조하십시오.
이 함수는 Qt 6.9에서 도입되었습니다.
serviceLevel() 및 QThread::serviceLevel()도 참조하십시오 .
void QThreadPool::start(QRunnable *runnable, int priority = 0)
이 스레드를 할당하고, 이를 사용하여 runnable 를 실행합니다. 단, 이 스레드로 인해 현재 스레드 수가 maxThreadCount()를 초과하게 되는 경우는 예외입니다. 이 경우, runnable 는 대신 실행 대기열에 추가됩니다. priority 인수를 사용하여 실행 대기열의 실행 순서를 제어할 수 있습니다.
runnable->autoDelete()이 true 을 반환하면 스레드 풀이 runnable 에 대한 소유권을 갖게 되며, runnable->run()이 반환된 후 runnable 는 스레드 풀에 의해 자동으로 삭제됩니다. runnable->autoDelete()이 false 을 반환하면 runnable 에 대한 소유권은 호출자에게 남아 있습니다. 이 함수를 호출한 후 runnable 의 자동 삭제 설정을 변경하면 정의되지 않은 동작이 발생한다는 점에 유의하십시오.
template <typename Callable> requires QRunnable::if_callable<Callable> void QThreadPool::start(Callable &&callableToRun, int priority = 0)
이 스레드가 추가되면 현재 스레드 수가 ` maxThreadCount()`을 초과하게 되는 경우가 아니라면, 스레드를 예약하고 이를 사용하여 ` callableToRun`를 실행합니다. 해당 경우, ` callableToRun `가 대신 실행 대기열에 추가됩니다. ` priority ` 인자를 사용하여 실행 대기열의 실행 순서를 제어할 수 있습니다.
참고: Qt 6.6 이전버전에서는 이 함수가 std::function<void()>를 매개변수로 받았기 때문에, 이동 전용 호출 가능 객체를 처리할 수 없었습니다.
제약 사항
Callable 가 인수를 하나도 받지 않고 호출될 수 있는 함수이거나 함수 객체인 경우에만 오버로드 해결에 참여합니다.
이 함수는 오버로드된 함수입니다.
[since 6.3] void QThreadPool::startOnReservedThread(QRunnable *runnable)
reserveThread()를 통해 이전에 예약된 스레드를 해제하고, 이를 사용하여 runnable 를 실행합니다.
runnable->autoDelete()이 true 를 반환하면 스레드 풀이 runnable 의 소유권을 인수하며, runnable->run()이 반환된 후 runnable 는 스레드 풀에 의해 자동으로 삭제됩니다. runnable->autoDelete()이 false 를 반환하면 runnable 의 소유권은 호출자에게 남아 있습니다. 이 함수를 호출한 후 runnable 의 자동 삭제 설정을 변경하면 정의되지 않은 동작이 발생합니다.
참고: 예약된 스레드가 없는 상태에서 이 함수를호출하면 정의되지 않은 동작이 발생합니다.
이 함수는 Qt 6.3에서 도입되었습니다.
reserveThread() 및 start()도 참조하십시오 .
[since 6.3] template <typename Callable> requires QRunnable::if_callable<Callable> void QThreadPool::startOnReservedThread(Callable &&callableToRun)
reserveThread()를 통해 이전에 예약된 스레드를 해제하고, 이를 사용하여 callableToRun 을 실행합니다.
참고: Qt 6.6 이전버전에서는 이 함수가 std::function<void()>를 매개변수로 받았기 때문에, 이동 전용 호출 가능 객체를 처리할 수 없었습니다.
제약 조건
Callable 가 인수를 하나도 받지 않고 호출될 수 있는 함수이거나 함수 객체인 경우에만 오버로드 해결에 참여합니다.
이 함수는 오버로드된 함수입니다.
이 함수는 Qt 6.3에서 도입되었습니다.
bool QThreadPool::tryStart(QRunnable *runnable)
runnable 를 실행하기 위해 스레드를 예약하려고 시도합니다.
호출 시점에 사용 가능한 스레드가 없으면, 이 함수는 아무 작업도 수행하지 않고 false 를 반환합니다. 그렇지 않은 경우, 사용 가능한 스레드 하나를 사용하여 runnable 가 즉시 실행되고, 이 함수는 true 를 반환합니다.
성공 시, ` runnable->autoDelete()`가 ` true`를 반환하면 스레드 풀이 ` runnable `에 대한 소유권을 가져가며, ` runnable->run()`가 반환된 후 ` runnable `는 스레드 풀에 의해 자동으로 삭제됩니다. ` runnable->autoDelete()`가 ` false`를 반환하면 ` runnable `에 대한 소유권은 호출자에게 남아 있습니다. 이 함수를 호출한 후 ` runnable `의 자동 삭제 설정을 변경하면 정의되지 않은 동작이 발생한다는 점에 유의하십시오.
template <typename Callable> requires QRunnable::if_callable<Callable> bool QThreadPool::tryStart(Callable &&callableToRun)
callableToRun 을 실행하기 위해 스레드를 예약하려고 시도합니다.
호출 시점에 사용 가능한 스레드가 없으면, 이 함수는 아무 작업도 수행하지 않고 false 를 반환합니다. 그렇지 않은 경우, callableToRun 가 사용 가능한 스레드 하나를 사용하여 즉시 실행되며, 이 함수는 true 를 반환합니다.
참고: Qt 6.6 이전버전에서는 이 함수가 std::function<void()>를 매개변수로 받았기 때문에, 이동 전용 호출 가능 객체를 처리할 수 없었습니다.
제약 조건
Callable 가 인자 없이 호출될 수 있는 함수이거나 함수 객체인 경우에만 오버로드 해결에 참여합니다.
이 함수는 오버로드된 함수입니다.
bool QThreadPool::tryTake(QRunnable *runnable)
지정된 runnable 가 아직 시작되지 않은 경우, 큐에서 이를 제거하려고 시도합니다. 실행 가능 객체가 시작되지 않은 경우, true 를 반환하며, runnable 의 소유권은 호출자에게 이전됩니다( runnable->autoDelete() == true 인 경우에도 마찬가지입니다). 그렇지 않은 경우 false 를 반환합니다.
참고: ` runnable->autoDelete() == true`인 경우 , 이 함수는 잘못된 런너블을 제거할 수 있습니다. 이는 ABA 문제( ABA problem)로 알려져 있습니다. 원래의 ` runnable `이 이미 실행되어 삭제되었을 수 있기 때문입니다. 해당 메모리는 다른 런너블에 재사용되며, 그 결과 의도한 런너블 대신 다른 런너블이 제거됩니다. 이러한 이유로, 자동 삭제되지 않는 실행 가능 객체에 대해서만 이 함수를 호출할 것을 권장합니다.
start() 및 QRunnable::autoDelete()도 참조하십시오 .
[since 6.8] bool QThreadPool::waitForDone(QDeadlineTimer deadline = QDeadlineTimer::Forever)
deadline 의 유효 기간이 만료될 때까지 기다려 모든 스레드가 종료되도록 한 다음, 스레드 풀에서 모든 스레드를 제거합니다. 모든 스레드가 제거된 경우 true 를 반환하고, 그렇지 않은 경우 false 를 반환합니다.
이 함수는 Qt 6.8에서 도입되었습니다.
bool QThreadPool::waitForDone(int msecs)
모든 스레드가 종료될 때까지 최대 msecs 밀리초 동안 대기한 후, 스레드 풀에서 모든 스레드를 제거합니다. 모든 스레드가 제거된 경우 true 를 반환하고, 그렇지 않은 경우 false 를 반환합니다. msecs 가 -1인 경우, 이 함수는 마지막 스레드가 종료될 때까지 대기합니다.
© 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.