QWaitCondition Class
QWaitCondition 클래스는 스레드 동기화를 위한 조건 변수를 제공합니다. 더 보기...
Header: | #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은 스레드가 특정 조건이 충족되었음을 다른 스레드에 알릴 수 있도록 합니다. 하나 또는 여러 개의 스레드가 wakeOne() 또는 wakeAll()로 조건을 설정하기 위해 QWaitCondition을 기다리는 것을 차단할 수 있습니다. 무작위로 선택한 스레드 하나를 깨우려면 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(); }
뮤텍스가 필요한 이유는 동일한 변수의 값을 동시에 변경하려는 두 스레드의 결과를 예측할 수 없기 때문입니다.
대기 조건은 강력한 스레드 동기화 기본 요소입니다. 대기 조건을 사용하는 생산자와 소비자 예제에서는 생산자 스레드와 소비자 스레드가 공유하는 순환 버퍼에 대한 액세스를 제어하기 위해 QSemaphore 대신 QWaitCondition을 사용하는 방법을 보여줍니다.
QMutex, QSemaphore, QThread, 그리고 대기 조건을 사용하는 생산자와 소비자도참조하세요 .
멤버 함수 문서
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()를 사용하여 신호를 보냅니다. 이 경우 이 함수는 참을 반환합니다.
- 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()를 사용하여 신호를 보냅니다. 이 경우 이 함수는 참을 반환합니다.
- 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()도 참조하세요 .
© 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.