QThreadPool Class

QThreadPool 클래스는 QThread 컬렉션을 관리합니다. 더 보기...

Header: #include <QThreadPool>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
상속합니다: QObject

참고: 이 클래스의 모든 함수는 스레드 안전합니다.

속성

공공 기능

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()
void setExpiryTimeout(int expiryTimeout)
void setMaxThreadCount(int maxThreadCount)
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 응용 프로그램에는 globalInstance()를 호출하여 액세스할 수 있는 하나의 전역 QThreadPool 객체가 있습니다.

QThreadPool 스레드 중 하나를 사용하려면 QRunnable 클래스를 서브클래싱하고 run() 가상 함수를 구현합니다. 그런 다음 해당 클래스의 객체를 생성하고 QThreadPool::start()에 전달합니다.

HelloWorldTask 클래스: public QRunnable
{ void run() override    {
        qDebug() << "Hello world from thread" << QThread::currentThread();
    } }; HelloWorldTask *hello = new HelloWorldTask();// QThreadPool이 소유권을 가져와 'hello'를 자동으로 삭제합니다.QThreadPool::globalInstance()->start(hello);

QThreadPool은 기본적으로 QRunnable 을 자동으로 삭제합니다. QRunnable::setAutoDelete ()를 사용하여 자동 삭제 플래그를 변경합니다.

QThreadPool은 QRunnable::run() 내에서 tryStart(이)를 호출하여 동일한 QRunnable 을 두 번 이상 실행하는 것을 지원합니다. 자동 삭제가 활성화된 경우 마지막 스레드가 실행 함수를 종료할 때 QRunnable 가 삭제됩니다. 자동 삭제가 활성화된 상태에서 동일한 QRunnable 으로 start()를 여러 번 호출하면 경쟁 조건이 발생하므로 권장되지 않습니다.

일정 시간 동안 사용되지 않은 스레드는 만료됩니다. 기본 만료 시간 제한은 30000밀리초(30초)입니다. setExpiryTimeout ()를 사용하여 변경할 수 있습니다. 만료 시간 제한을 음수로 설정하면 만료 메커니즘이 비활성화됩니다.

maxThreadCount()를 호출하여 사용할 수 있는 최대 스레드 수를 조회합니다. 필요한 경우 setMaxThreadCount()를 사용하여 제한을 변경할 수 있습니다. 기본 maxThreadCount()는 QThread::idealThreadCount()입니다. activeThreadCount () 함수는 현재 작업 중인 스레드 수를 반환합니다.

reserveThread() 함수는 외부 사용을 위해 스레드를 예약합니다. 스레드 작업을 완료하면 releaseThread()를 사용하여 재사용할 수 있도록 합니다. 기본적으로 이러한 함수는 활성 스레드 수를 일시적으로 늘리거나 줄이며 QThreadPool에 표시되지 않는 시간 소모적인 작업을 구현할 때 유용합니다.

QThreadPool은 스레드 관리를 위한 저수준 클래스이며, 더 높은 수준의 대안은 Qt Concurrent 모듈을 참조하세요.

QRunnable도 참조하세요 .

속성 문서

[read-only] activeThreadCount : const int

이 속성은 스레드 풀의 활성 스레드 수를 보유합니다.

참고: 이 함수는 maxThreadCount()보다 큰 값을 반환할 수 있습니다. 자세한 내용은 reserveThread()를 참조하세요.

함수에 액세스합니다:

int activeThreadCount() const

reserveThread() 및 releaseThread()도 참조하세요 .

expiryTimeout : int

이 속성은 스레드 만료 시간 제한 값을 밀리초 단위로 저장합니다.

만료 시간 제한 밀리초 동안 사용되지 않은 스레드는 만료된 것으로 간주되어 종료됩니다. 이러한 스레드는 필요에 따라 다시 시작됩니다. 기본값 expiryTimeout 은 30000밀리초(30초)입니다. expiryTimeout 이 음수인 경우 새로 만든 스레드는 만료되지 않으며, 예를 들어 스레드 풀이 파괴될 때까지 종료되지 않습니다.

expiryTimeout 설정은 이미 실행 중인 스레드에는 영향을 미치지 않습니다. 새로 생성된 스레드만 새로운 expiryTimeout 을 사용합니다. expiryTimeout 은 스레드 풀을 만든 직후에 start()을 호출하기 전에 설정하는 것이 좋습니다.

함수 액세스:

int expiryTimeout() const
void setExpiryTimeout(int expiryTimeout)

maxThreadCount : int

이 속성은 스레드 풀에서 사용하는 최대 스레드 수를 보유합니다. 이 속성은 QThreadPool 객체가 생성되는 시점에 QThread::idealThreadCount() 값으로 기본 설정됩니다.

참고: maxThreadCount 제한이 0이거나 음수인 경우에도 스레드 풀은 항상 최소 1개 이상의 스레드를 사용합니다.

기본값 maxThreadCountQThread::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 이며, QThreadQThreadPool 객체가 있는 것과 동일한 우선순위를 사용합니다.

이 속성은 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() 스레드를 2개 이상 예약하더라도 스레드 풀은 여전히 최소 1개의 스레드를 허용합니다.

참고: 이 함수를 사용하면 보고되는 활성 스레드 수가 증가합니다. 즉, 이 함수를 사용하면 activeThreadCount()가 maxThreadCount()보다 큰 값을 반환할 수 있습니다.

releaseThread()도 참조하세요 .

void QThreadPool::start(QRunnable *runnable, int priority = 0)

스레드를 예약하고 이 스레드로 인해 현재 스레드 수가 maxThreadCount()을 초과하지 않는 한 runnable 을 실행하는 데 사용합니다. 이 경우 runnable 가 대신 실행 대기열에 추가됩니다. priority 인수를 사용하여 실행 대기열의 실행 순서를 제어할 수 있습니다.

runnable->autoDelete()가 true 를 반환하면 스레드 풀이 runnable 의 소유권을 가지며, runnable->run()가 반환된 후 runnable 은 스레드 풀에 의해 자동으로 삭제됩니다. runnable->autoDelete ()가 false 을 반환하면 runnable 의 소유권은 호출자에게 유지됩니다. 이 함수를 호출한 후 runnable 에서 자동 삭제를 변경하면 정의되지 않은 동작이 발생한다는 점에 유의하세요.

template <typename Callable, QRunnable::if_callable<Callable> = true> void QThreadPool::start(Callable &&callableToRun, int priority = 0)

이 함수는 오버로드된 함수입니다.

스레드를 예약하고 이 스레드로 인해 현재 스레드 수가 maxThreadCount()을 초과하지 않는 한 callableToRun 을 실행하는 데 사용합니다. 이 경우 callableToRun 가 대신 실행 대기열에 추가됩니다. priority 인수를 사용하여 실행 대기열의 실행 순서를 제어할 수 있습니다.

참고: 이 함수는 Callable 인수가 0으로 호출할 수 있는 함수 또는 함수 객체인 경우에만 과부하 해결에 참여합니다.

참고: 6.6 이전 Qt 버전에서 이 함수는 std::function<void()>을 사용했기 때문에 이동 전용 콜러블을 처리할 수 없었습니다.

[since 6.3] void QThreadPool::startOnReservedThread(QRunnable *runnable)

이전에 reserveThread()로 예약된 스레드를 해제하고 이를 사용하여 runnable 을 실행합니다.

runnable->autoDelete()가 true 을 반환하면 스레드 풀이 runnable 의 소유권을 가지며, runnablerunnable->run()가 반환된 후 스레드 풀에 의해 자동으로 삭제됩니다. runnable->autoDelete ()가 false 을 반환하면 runnable 의 소유권은 호출자에게 유지됩니다. 이 함수를 호출한 후 runnable 에서 자동 삭제를 변경하면 정의되지 않은 동작이 발생한다는 점에 유의하세요.

참고: 예약된 스레드가 없을 때 이 함수를 호출하면 정의되지 않은 동작이 발생합니다.

이 함수는 Qt 6.3에 도입되었습니다.

reserveThread() 및 start()도 참조하세요 .

[since 6.3] template <typename Callable, QRunnable::if_callable<Callable> = true> void QThreadPool::startOnReservedThread(Callable &&callableToRun)

이 함수는 오버로드된 함수입니다.

이전에 reserveThread()로 예약된 스레드를 해제하고 이를 사용하여 callableToRun 을 실행합니다.

참고: 이 함수는 Callable 가 인자 0으로 호출할 수 있는 함수 또는 함수 객체인 경우에만 과부하 해결에 참여합니다.

참고: 6.6 이전 Qt 버전에서 이 함수는 std::function<void()>을 사용했기 때문에 이동 전용 콜러블을 처리할 수 없었습니다.

이 함수는 Qt 6.3에 도입되었습니다.

bool QThreadPool::tryStart(QRunnable *runnable)

runnable 을 실행할 스레드 예약을 시도합니다.

호출 시 사용 가능한 스레드가 없는 경우 이 함수는 아무 작업도 수행하지 않고 false 을 반환합니다. 그렇지 않으면 runnable 은 사용 가능한 스레드 하나를 사용하여 즉시 실행되고 이 함수는 true 을 반환합니다.

runnable->autoDelete()이 true 을 반환하면 성공 시 스레드 풀이 runnable 의 소유권을 가지며, runnablerunnable->run()이 반환된 후 스레드 풀에 의해 자동으로 삭제된다는 점에 유의하세요. runnable->autoDelete ()가 false 을 반환하면 runnable 의 소유권은 호출자에게 유지됩니다. 이 함수를 호출한 후 runnable 에서 자동 삭제를 변경하면 정의되지 않은 동작이 발생한다는 점에 유의하세요.

template <typename Callable, QRunnable::if_callable<Callable> = true> bool QThreadPool::tryStart(Callable &&callableToRun)

이 함수는 과부하된 함수입니다.

callableToRun 을 실행할 스레드를 예약하려고 시도합니다.

호출 시 사용 가능한 스레드가 없는 경우 이 함수는 아무 작업도 수행하지 않고 false 을 반환합니다. 그렇지 않으면 사용 가능한 스레드 하나를 사용하여 callableToRun 이 즉시 실행되고 이 함수는 true 을 반환합니다.

참고: 이 함수는 Callable 이 인자가 0으로 호출할 수 있는 함수 또는 함수 객체인 경우에만 과부하 해결에 참여합니다.

참고: 6.6 이전 Qt 버전에서 이 함수는 std::function<void()>을 사용하므로 이동 전용 콜러블을 처리할 수 없었습니다.

bool QThreadPool::tryTake(QRunnable *runnable)

지정된 runnable 이 아직 시작되지 않은 경우 큐에서 제거를 시도합니다. 런처블이 시작되지 않았다면 true 을 반환하고 runnable 의 소유권이 호출자에게 이전됩니다( runnable->autoDelete() == true 일 때도 마찬가지입니다). 그렇지 않으면 false 을 반환합니다.

참고: runnable->autoDelete() == true 이 함수는 잘못된 런처블을 제거할 수 있습니다. 이를 ABA 문제라고 하는데, 원본 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이면 이 함수는 마지막 스레드가 종료될 때까지 기다립니다.

© 2025 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.