QMutex Class
QMutex 클래스는 스레드 간에 액세스 순차화를 제공합니다. 더 보기...
| 헤더: | #include <QMutex> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
- 상속된 멤버를 포함한 모든 멤버 목록
- QMutex는 스레딩 클래스의 일부입니다.
참고: 이 클래스의 모든 함수는 스레드 안전합니다.
공개 함수
| QMutex() | |
| ~QMutex() | |
| void | lock() |
(since 6.6) bool | tryLock(QDeadlineTimer timer) |
| bool | tryLock(int timeout) |
| bool | tryLock() |
| bool | try_lock() |
| bool | try_lock_for(std::chrono::duration<Rep, Period> duration) |
| bool | try_lock_until(std::chrono::time_point<Clock, Duration> timePoint) |
| void | unlock() |
상세 설명
QMutex의 목적은 객체, 데이터 구조 또는 코드 섹션을 보호하여 한 번에 하나의 스레드만 액세스할 수 있도록 하는 것입니다(이는 Java의 synchronized 키워드와 유사합니다). 일반적으로 QMutexLocker 와 함께 뮤텍스를 사용하는 것이 가장 좋으며, 이렇게 하면 잠금 및 잠금 해제가 일관되게 수행되도록 쉽게 보장할 수 있습니다.
예를 들어, 사용자에게 두 줄로 메시지를 출력하는 메서드가 있다고 가정해 봅시다.
int number = 6;
void method1()
{
number *= 5;
number /= 4;
}
void method2()
{
number *= 3;
number /= 2;
}이 두 메서드가 차례로 호출되면 다음과 같은 일이 발생합니다:
// method1()
number *= 5; // number is now 30
number /= 4; // number is now 7
// method2()
number *= 3; // number is now 21
number /= 2; // number is now 10이 두 메서드가 두 개의 스레드에서 동시에 호출되면 다음과 같은 순서가 발생할 수 있습니다:
// Thread 1 calls method1()
number *= 5; // number is now 30
// Thread 2 calls method2().
//
// Most likely Thread 1 has been put to sleep by the operating
// system to allow Thread 2 to run.
number *= 3; // number is now 90
number /= 2; // number is now 45
// Thread 1 finishes executing.
number /= 4; // number is now 11, instead of 10뮤텍스를 추가하면 원하는 결과를 얻을 수 있습니다:
QMutex mutex;
int number = 6;
void method1()
{
mutex.lock();
number *= 5;
number /= 4;
mutex.unlock();
}
void method2()
{
mutex.lock();
number *= 3;
number /= 2;
mutex.unlock();
}그러면 주어진 시점에 단 하나의 스레드만이 number 을 수정할 수 있으며, 결과는 올바르게 나옵니다. 물론 이것은 사소한 예시이지만, 특정 순서대로 처리되어야 하는 다른 모든 경우에도 적용됩니다.
한 스레드에서 ` lock()`를 호출하면, 같은 위치에서 ` lock()`를 호출하려는 다른 스레드들은 락을 획득한 스레드가 ` unlock()`를 호출할 때까지 차단됩니다. ` lock()`의 비차단 대안으로는 ` tryLock()`가 있습니다.
QMutex는 경합이 없는 경우 빠른 속도를 내도록 최적화되어 있습니다. 해당 뮤텍스에 경합이 없으면 메모리를 할당하지 않습니다. 생성 및 소멸 시 오버헤드가 거의 없으므로, 다른 클래스의 일부로 많은 뮤텍스를 두어도 무방합니다.
QRecursiveMutex, QMutexLocker, QReadWriteLock, QSemaphore 및 QWaitCondition도 참조하십시오 .
멤버 함수 문서
[constexpr noexcept default] QMutex::QMutex()
새로운 뮤텍스를 생성합니다. 이 뮤텍스는 잠금 해제된 상태로 생성됩니다.
[noexcept] QMutex::~QMutex()
뮤텍스를 파기합니다.
경고: 잠겨 있는 뮤텍스를해제하면 정의되지 않은 동작이 발생할 수 있습니다.
[noexcept(...)] void QMutex::lock()
뮤텍스를 잠급니다. 다른 스레드가 이미 뮤텍스를 잠근 상태라면, 이 호출은 해당 스레드가 잠금을 해제할 때까지 차단됩니다.
뮤텍스가 이미 현재 스레드에 의해 잠겨 있는 경우, 이 호출은 절대 반환되지 않아 교착 상태를 유발합니다.
참고: ` FutexAlwaysAvailable `가 ` true`인 경우,이 함수는 `noexcept`입니다.
unlock()도 참조하십시오 .
[noexcept(...), since 6.6] bool QMutex::tryLock(QDeadlineTimer timer)
뮤텍스를 잠그려고 시도합니다. 이 함수는 잠금이 성공하면 ` true `를 반환하고, 그렇지 않으면 ` false`를 반환합니다. 다른 스레드가 뮤텍스를 잠근 상태라면, 이 함수는 ` timer `가 만료되어 뮤텍스가 사용 가능해질 때까지 대기합니다.
잠금을 획득한 경우, 다른 스레드가 뮤텍스를 성공적으로 잠글 수 있으려면 먼저 unlock()를 호출하여 뮤텍스의 잠금을 해제해야 합니다.
이 함수는 Qt 6.6에서 도입되었습니다.
참고: FutexAlwaysAvailable 가 true 인 경우,이 함수는 noexcept입니다.
[noexcept(...)] bool QMutex::tryLock(int timeout)
뮤텍스를 잠그려고 시도합니다. 이 함수는 잠금이 성공하면 ` true `를 반환하고, 그렇지 않으면 ` false`를 반환합니다. 다른 스레드가 뮤텍스를 잠근 상태라면, 이 함수는 뮤텍스가 사용 가능해질 때까지 최대 ` timeout ` 밀리초 동안 대기합니다.
참고: timeout 매개변수로 음수를 전달하는 것은 lock()를 호출하는 것과 동일합니다. 즉, timeout 가 음수인 경우 이 함수는 뮤텍스를 잠글 수 있을 때까지 무한정 대기합니다.
잠금이 확보된 경우, 다른 스레드가 뮤텍스를 성공적으로 잠글 수 있으려면 먼저 unlock()을 사용하여 뮤텍스의 잠금을 해제해야 합니다.
참고: FutexAlwaysAvailable 가 true 일 때이 함수는 noexcept입니다.
[noexcept] bool QMutex::tryLock()
뮤텍스를 잠그려고 시도합니다. 이 함수는 잠금이 성공하면 ` true `를 반환하고, 그렇지 않으면 ` false`를 반환합니다.
잠금이 확보된 경우, 다른 스레드가 뮤텍스를 성공적으로 잠글 수 있으려면 먼저 unlock()을 호출하여 뮤텍스의 잠금을 해제해야 합니다.
이 함수는 오버로드된 함수입니다.
[noexcept] bool QMutex::try_lock()
뮤텍스를 잠그려고 시도합니다. 이 함수는 잠금이 성공하면 true 를 반환하고, 그렇지 않으면 false 를 반환합니다.
이 함수는 표준 라이브러리의 개념인 ` Lockable`과의 호환성을 위해 제공됩니다. 이는 ` tryLock()`와 동등합니다.
template <typename Rep, typename Period> bool QMutex::try_lock_for(std::chrono::duration<Rep, Period> duration)
뮤텍스를 잠그려고 시도합니다. 이 함수는 잠금이 성공하면 ` true `를 반환하고, 그렇지 않으면 ` false`를 반환합니다. 다른 스레드가 뮤텍스를 잠근 상태라면, 이 함수는 뮤텍스가 사용 가능해질 때까지 최소한 ` duration ` 동안 대기합니다.
참고: duration 로 음수의 지속 시간을 전달하는 것은 try_lock()를 호출하는 것과 동일합니다. 이 동작은 tryLock()와는 다릅니다.
잠금이 획득된 경우, 다른 스레드가 뮤텍스를 성공적으로 잠글 수 있으려면 먼저 unlock()를 호출하여 뮤텍스의 잠금을 해제해야 합니다.
template <typename Clock, typename Duration> bool QMutex::try_lock_until(std::chrono::time_point<Clock, Duration> timePoint)
뮤텍스를 잠그려고 시도합니다. 이 함수는 잠금이 성공하면 ` true `을 반환하고, 그렇지 않으면 ` false`을 반환합니다. 다른 스레드가 뮤텍스를 잠근 상태라면, 이 함수는 뮤텍스가 사용 가능해질 때까지 최소한 ` timePoint `까지 대기합니다.
참고: 이미 만료된 timePoint 를 전달하는 것은 try_lock()를 호출하는 것과 동일합니다. 이 동작은 tryLock()와는 다릅니다.
잠금이 획득된 경우, 다른 스레드가 성공적으로 잠금을 획득하려면 먼저 unlock()를 호출하여 뮤텍스를 해제해야 합니다.
[noexcept] void QMutex::unlock()
뮤텍스를 잠금 해제합니다. 뮤텍스를 잠근 스레드와 다른 스레드에서 잠금 해제를 시도하면 오류가 발생합니다. 잠겨 있지 않은 뮤텍스의 잠금을 해제하면 정의되지 않은 동작이 발생합니다.
lock()도 참조하십시오 .
© 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.