QMutexLocker Class
template <typename Mutex> class QMutexLockerQMutexLocker 클래스는 뮤텍스 잠금 및 잠금 해제를 간소화하는 편의 클래스입니다. 더 보기...
Header: | #include <QMutexLocker> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
- 상속된 멤버를 포함한 모든 멤버 목록
- QMutexLocker는 스레딩 클래스의 일부입니다.
참고: 이 클래스의 모든 함수는 스레드 안전합니다.
공용 함수
QMutexLocker(Mutex *mutex) | |
(since 6.4) | QMutexLocker(QMutexLocker<Mutex> &&other) |
~QMutexLocker() | |
(since 6.4) bool | isLocked() const |
Mutex * | mutex() const |
void | relock() |
(since 6.4) void | swap(QMutexLocker<Mutex> &other) |
void | unlock() |
(since 6.4) QMutexLocker<Mutex> & | operator=(QMutexLocker<Mutex> &&other) |
상세 설명
복잡한 함수 및 문이나 예외 처리 코드에서 QMutex 또는 QRecursiveMutex 을 잠그고 해제하는 것은 오류가 발생하기 쉽고 디버깅하기 어렵습니다. 이러한 상황에서 QMutexLocker를 사용하면 뮤텍스의 상태가 항상 잘 정의되어 있는지 확인할 수 있습니다.
QMutexLocker는 QMutex 을 잠글 필요가 있는 함수 내에 생성해야 합니다. QMutexLocker가 생성되면 뮤텍스는 잠깁니다. unlock()
및 relock()
을 사용하여 뮤텍스의 잠금을 해제하고 다시 잠글 수 있습니다. 잠긴 경우 QMutexLocker가 파괴되면 뮤텍스의 잠금이 해제됩니다.
예를 들어, 이 복잡한 함수는 함수에 들어갈 때 QMutex 을 잠그고 모든 출구 지점에서 뮤텍스의 잠금을 해제합니다:
int complexFunction(int flag) { mutex.lock(); int retVal = 0; switch (flag) { case 0: case 1: retVal = moreComplexFunction(flag); break; case 2: { int status = anotherFunction(); if (status < 0) { mutex.unlock(); return -2; } retVal = status + flag; } break; default: if (flag > 10) { mutex.unlock(); return -1; } break; } mutex.unlock(); return retVal; }
이 예제 함수는 개발이 진행될수록 더 복잡해지므로 오류가 발생할 가능성이 높아집니다.
QMutexLocker를 사용하면 코드가 크게 단순화되고 가독성이 높아집니다:
int complexFunction(int flag) { QMutexLocker locker(&mutex); int retVal = 0; switch (flag) { case 0: case 1: return moreComplexFunction(flag); case 2: { int status = anotherFunction(); if (status < 0) return -2; retVal = status + flag; } break; default: if (flag > 10) return -1; break; } return retVal; }
이제 QMutexLocker 객체가 파괴될 때( locker
이 자동 변수이므로 함수가 반환될 때) 뮤텍스는 항상 잠금이 해제됩니다.
예외를 던지고 잡는 코드에도 동일한 원칙이 적용됩니다. 뮤텍스를 잠근 함수에서 잡히지 않은 예외는 예외가 스택을 통해 호출 함수로 전달되기 전에 뮤텍스를 잠금 해제할 방법이 없습니다.
QMutexLocker는 또한 QMutexLocker가 작동 중인 뮤텍스를 반환하는 mutex()
멤버 함수를 제공합니다. 이 함수는 QWaitCondition::wait()와 같이 뮤텍스에 액세스해야 하는 코드에 유용합니다. 예를 들어:
class SignalWaiter { private: QMutexLocker<QMutex> locker; public: SignalWaiter(QMutex *mutex) : locker(mutex) { } void waitForSignal() { ... while (!signalled) waitCondition.wait(locker.mutex()); ... } };
QReadLocker, QWriteLocker, QMutex 를참조하세요 .
멤버 함수 문서
[explicit noexcept]
QMutexLocker::QMutexLocker(Mutex *mutex)
QMutexLocker를 생성하고 mutex 을 잠급니다. QMutexLocker가 파괴되면 뮤텍스가 잠금 해제됩니다. mutex 이 nullptr
인 경우 QMutexLocker는 아무 작업도 수행하지 않습니다.
QMutex::lock()도 참조하십시오 .
[noexcept, since 6.4]
QMutexLocker::QMutexLocker(QMutexLocker<Mutex> &&other)
이동 - other 에서 QMutexLocker를 생성합니다. 뮤텍스와 other 의 상태가 새로 생성된 인스턴스로 전송됩니다. 이동 후 other 은 더 이상 뮤텍스를 관리하지 않습니다.
이 함수는 Qt 6.4에 도입되었습니다.
QMutex::lock()도 참조하십시오 .
QMutexLocker::~QMutexLocker()
QMutexLocker 을 파괴하고 생성자에서 잠겨 있던 뮤텍스를 잠금 해제합니다.
QMutex::unlock()도 참조하세요 .
[noexcept, since 6.4]
bool QMutexLocker::isLocked() const
QMutexLocker 이 현재 연결된 뮤텍스를 잠그고 있으면 참을 반환하고, 그렇지 않으면 거짓을 반환합니다.
이 함수는 Qt 6.4에 도입되었습니다.
Mutex *QMutexLocker::mutex() const
QMutexLocker 가 운영 중인 뮤텍스를 반환합니다.
[noexcept]
void QMutexLocker::relock()
잠금 해제된 뮤텍스 보관함을 잠금 해제합니다.
unlock()도 참조하세요 .
[noexcept, since 6.4]
void QMutexLocker::swap(QMutexLocker<Mutex> &other)
뮤텍스와 이 QMutexLocker 의 상태를 other 로 바꿉니다. 이 작업은 매우 빠르며 실패하지 않습니다.
이 함수는 Qt 6.4에 도입되었습니다.
QMutex::lock()도 참조하십시오 .
[noexcept]
void QMutexLocker::unlock()
이 뮤텍스 보관함을 잠금 해제합니다. relock()
을 사용하여 다시 잠글 수 있습니다. 파괴 시에는 잠글 필요가 없습니다.
relock()도 참조하세요 .
[noexcept, since 6.4]
QMutexLocker<Mutex> &QMutexLocker::operator=(QMutexLocker<Mutex> &&other)
이동 - other 을 이 QMutexLocker 에 할당합니다. 할당하기 전에 이 QMutexLocker 에 잠긴 뮤텍스가 있었다면 뮤텍스의 잠금이 해제됩니다. 그러면 other 의 뮤텍스와 상태가 이 QMutexLocker 으로 이전됩니다. 이동 후 other 은 더 이상 뮤텍스를 관리하지 않습니다.
이 함수는 Qt 6.4에 도입되었습니다.
QMutex::lock()도 참조하십시오 .
© 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.