QMutex Class

QMutex 클래스는 스레드 간 액세스 직렬화를 제공합니다. 더 보기...

Header: #include <QMutex>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

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

공용 함수

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] QMutex::QMutex()

새 뮤텍스를 생성합니다. 뮤텍스는 잠금 해제된 상태로 생성됩니다.

[noexcept] QMutex::~QMutex()

뮤텍스를 파괴합니다.

경고: 잠긴 뮤텍스를 파괴하면 정의되지 않은 동작이 발생할 수 있습니다.

[noexcept] void QMutex::lock()

뮤텍스를 잠급니다. 다른 스레드가 뮤텍스를 잠그면 해당 스레드가 잠금을 해제할 때까지 이 호출이 차단됩니다.

동일한 스레드에서 동일한 뮤텍스에서 이 함수를 여러 번 호출하면 데드락이 발생합니다.

unlock()도 참조하세요 .

[noexcept, since 6.6] bool QMutex::tryLock(QDeadlineTimer timer)

뮤텍스 잠금을 시도합니다. 이 함수는 잠금을 얻은 경우 true 을 반환하고, 그렇지 않으면 false 을 반환합니다. 다른 스레드가 뮤텍스를 잠근 경우, 이 함수는 timer 이 만료될 때까지 뮤텍스를 사용할 수 있을 때까지 기다립니다.

잠금을 얻은 경우 다른 스레드가 성공적으로 잠그기 전에 unlock()로 뮤텍스의 잠금을 해제해야 합니다.

동일한 스레드에서 동일한 뮤텍스에서 이 함수를 여러 번 호출하면 데드락이 발생합니다.

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

lock() 및 unlock()도 참조하십시오 .

[noexcept] bool QMutex::tryLock(int timeout)

뮤텍스 잠금을 시도합니다. 이 함수는 잠금이 획득되면 true 을 반환하고, 그렇지 않으면 false 을 반환합니다. 다른 스레드가 뮤텍스를 잠근 경우, 이 함수는 뮤텍스를 사용할 수 있을 때까지 최대 timeout 밀리초 동안 기다립니다.

참고: 음수를 timeout 으로 전달하는 것은 lock()을 호출하는 것과 같습니다. 즉, timeout 이 음수인 경우 이 함수는 뮤텍스가 잠길 때까지 영원히 기다립니다.

잠금을 얻은 경우 다른 스레드가 성공적으로 잠그기 전에 unlock()로 뮤텍스의 잠금을 해제해야 합니다.

동일한 스레드에서 동일한 뮤텍스에서 이 함수를 여러 번 호출하면 데드락이 발생합니다.

lock() 및 unlock()도 참조하세요 .

[noexcept] bool QMutex::tryLock()

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

뮤텍스 잠금을 시도합니다. 이 함수는 잠금을 얻은 경우 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.

잠금을 얻은 경우 다른 스레드가 성공적으로 잠그기 전에 unlock()로 뮤텍스의 잠금을 해제해야 합니다.

동일한 스레드에서 동일한 뮤텍스에서 이 함수를 여러 번 호출하면 데드락이 발생할 수 있습니다.

lock() 및 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()로 뮤텍스의 잠금을 해제해야 합니다.

동일한 스레드에서 동일한 뮤텍스에서 이 함수를 여러 번 호출하면 데드락이 발생합니다.

lock() 및 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()로 뮤텍스의 잠금을 해제해야 합니다.

동일한 스레드에서 동일한 뮤텍스에서 이 함수를 여러 번 호출하면 데드락이 발생합니다.

lock() 및 unlock()도 참조하세요 .

[noexcept] void QMutex::unlock()

뮤텍스를 잠금 해제합니다. 뮤텍스를 잠근 스레드와 다른 스레드에서 뮤텍스의 잠금을 해제하려고 하면 오류가 발생합니다. 잠겨 있지 않은 뮤텍스를 잠금 해제하면 정의되지 않은 동작이 발생합니다.

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.