QWaitCondition Class
QWaitCondition 클래스는 스레드 동기화를 위한 조건 변수를 제공합니다. 더 보기...
| 헤더: | #include <QWaitCondition> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
- 상속된 멤버를 포함한 모든 멤버 목록
- QWaitCondition은 스레딩 클래스의 일부입니다.
참고: 이 클래스의 모든 함수는 스레드 안전합니다.
공개 함수
| QWaitCondition() | |
| ~QWaitCondition() | |
| void | notify_all() |
| void | notify_one() |
| bool | wait(QMutex *lockedMutex, QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever)) |
| bool | wait(QReadWriteLock *lockedReadWriteLock, QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever)) |
| bool | wait(QMutex *lockedMutex, unsigned long time) |
| bool | wait(QReadWriteLock *lockedReadWriteLock, unsigned long time) |
| void | wakeAll() |
| void | wakeOne() |
상세 설명
QWaitCondition을 사용하면 한 스레드가 다른 스레드들에게 특정 조건이 충족되었음을 알릴 수 있습니다. 하나 또는 여러 스레드가 QWaitCondition이 wakeOne() 또는 wakeAll()을 사용하여 조건을 설정할 때까지 대기 상태로 차단될 수 있습니다. wakeOne()을 사용하여 무작위로 선택된 하나의 스레드를 깨우거나, wakeAll()을 사용하여 모든 스레드를 깨울 수 있습니다.
예를 들어, 사용자가 키를 누를 때마다 수행되어야 하는 세 가지 작업이 있다고 가정해 봅시다. 각 작업은 하나의 스레드로 나눌 수 있으며, 각 스레드는 다음과 같은 run() 본문을 갖게 됩니다.
forever {
mutex.lock();
keyPressed.wait(&mutex);
do_something();
mutex.unlock();
}여기서 keyPressed 변수는 QWaitCondition 유형의 전역 변수입니다.
네 번째 스레드는 키 입력을 감지하고, 키 입력을 받을 때마다 다른 세 스레드를 다음과 같이 깨웁니다:
forever {
getchar();
keyPressed.wakeAll();
}세 스레드가 깨어나는 순서는 정의되지 않습니다. 또한, 키가 눌렸을 때 일부 스레드가 여전히 do_something() 상태에 있다면, 해당 스레드들은 조건 변수를 기다리고 있지 않으므로 깨어나지 않게 되며, 결과적으로 해당 키 입력에 대한 작업은 수행되지 않습니다. 이 문제는 카운터와 이를 보호하는 QMutex 를 사용하여 해결할 수 있습니다. 예를 들어, 워커 스레드에 대한 새로운 코드는 다음과 같습니다:
forever {
mutex.lock();
keyPressed.wait(&mutex);
++count;
mutex.unlock();
do_something();
mutex.lock();
--count;
mutex.unlock();
}다음은 네 번째 스레드의 코드입니다:
forever {
getchar();
mutex.lock();
// Sleep until there are no busy worker threads
while (count > 0) {
mutex.unlock();
sleep(1);
mutex.lock();
}
keyPressed.wakeAll();
mutex.unlock();
}뮤텍스가 필요한 이유는 두 스레드가 동시에 동일한 변수의 값을 변경하려고 시도할 경우 결과가 예측 불가능하기 때문입니다.
대기 조건( Wait Condition )은 강력한 스레드 동기화 기본 요소입니다. ‘대기 조건을 사용하는 프로듀서 및 컨슈머’ 예제는 프로듀서 스레드와 컨슈머 스레드가 공유하는 순환 버퍼에 대한 액세스를 제어하기 위해 QSemaphore 대신 QWaitCondition을 사용하는 방법을 보여줍니다.
QMutex, QSemaphore, QThread 및 ‘Wait Conditions를 사용하는 프로듀서와 컨슈머’항목도 참조하십시오 .
멤버 함수 문서
QWaitCondition::QWaitCondition()
새로운 대기 조건 객체를 생성합니다.
[noexcept] QWaitCondition::~QWaitCondition()
대기 조건 객체를 삭제합니다.
void QWaitCondition::notify_all()
이 함수는 STL 호환성을 위해 제공됩니다. 이 함수는 ` wakeAll()`와 동일합니다.
void QWaitCondition::notify_one()
이 함수는 STL 호환성을 위해 제공됩니다. 이 함수는 ` wakeOne()`와 동일합니다.
bool QWaitCondition::wait(QMutex *lockedMutex, QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))
lockedMutex 를 해제하고 대기 조건이 충족될 때까지 대기합니다. lockedMutex 는 호출 스레드에 의해 미리 잠겨 있어야 합니다. lockedMutex 가 잠겨 있지 않은 경우, 동작은 정의되지 않습니다. lockedMutex 가 재귀 뮤텍스인 경우, 이 함수는 즉시 반환됩니다. lockedMutex 는 잠금이 해제되며, 호출 스레드는 다음 조건 중 하나가 충족될 때까지 차단됩니다:
- 다른 스레드가 wakeOne() 또는 wakeAll()를 사용하여 신호를 보냅니다. 이 경우 이 함수는 true를 반환합니다.
- deadline 에서 지정한 데드라인에 도달합니다. deadline 가
QDeadlineTimer::Forever(기본값)인 경우, 대기 시간은 절대 초과되지 않습니다(이벤트가 신호되어야 함). 대기 시간이 초과된 경우 이 함수는 false를 반환합니다.
lockedMutex 는 동일한 잠금 상태로 반환됩니다. 이 함수는 잠금 상태에서 대기 상태로의 원자적 전환을 가능하게 하기 위해 제공됩니다.
wakeOne() 및 wakeAll()도 참조하십시오 .
bool QWaitCondition::wait(QReadWriteLock *lockedReadWriteLock, QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))
lockedReadWriteLock 을 해제하고 대기 조건이 충족될 때까지 대기합니다. lockedReadWriteLock 은 호출 스레드에 의해 미리 잠겨 있어야 합니다. lockedReadWriteLock 이 잠긴 상태가 아닌 경우, 이 함수는 즉시 반환됩니다. lockedReadWriteLock 은 재귀적으로 잠겨서는 안 되며, 그렇지 않으면 이 함수가 잠금을 제대로 해제하지 못합니다. lockedReadWriteLock 의 잠금이 해제되며, 호출 스레드는 다음 조건 중 하나가 충족될 때까지 차단됩니다:
- 다른 스레드가 wakeOne() 또는 wakeAll()를 사용하여 신호를 보냅니다. 이 경우 이 함수는 true를 반환합니다.
- deadline 에서 지정한 마감 시간이 도래합니다. deadline 가
QDeadlineTimer::Forever(기본값)인 경우, 대기 시간은 절대 초과되지 않습니다(이벤트가 신호되어야 함). 대기 시간이 초과된 경우 이 함수는 false를 반환합니다.
lockedReadWriteLock 는 동일한 잠금 상태로 반환됩니다. 이 함수는 잠금 상태에서 대기 상태로의 원자적 전환을 허용하기 위해 제공됩니다.
wakeOne() 및 wakeAll()도 참조하십시오 .
bool QWaitCondition::wait(QMutex *lockedMutex, unsigned long time)
lockedMutex 를 해제하고, time 밀리초 동안 대기 조건을 기다립니다.
이 함수는 오버로드된 함수입니다.
bool QWaitCondition::wait(QReadWriteLock *lockedReadWriteLock, unsigned long time)
lockedReadWriteLock 를 해제하고, time 밀리초 동안 대기 조건이 충족될 때까지 대기합니다.
이 함수는 오버로드된 함수입니다.
void QWaitCondition::wakeAll()
대기 조건을 기다리고 있는 모든 스레드를 깨웁니다. 스레드가 깨어나는 순서는 운영 체제의 스케줄링 정책에 따라 달라지며, 제어하거나 예측할 수 없습니다.
wakeOne()도 참조하십시오 .
void QWaitCondition::wakeOne()
대기 조건을 기다리고 있는 스레드 하나를 깨웁니다. 깨어나는 스레드는 운영 체제의 스케줄링 정책에 따라 달라지며, 이를 제어하거나 예측할 수 없습니다.
특정 스레드를 깨우고 싶다면, 일반적으로 서로 다른 대기 조건을 사용하여 각기 다른 스레드가 서로 다른 조건을 대기하도록 하는 것이 해결책입니다.
wakeAll()도 참조하십시오 .
© 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.