이 페이지에서

QReadWriteLock Class

QReadWriteLock 클래스는 읽기-쓰기 잠금 기능을 제공합니다. 더 보기...

헤더: #include <QReadWriteLock>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
상속: QBasicReadWriteLock

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

공개 유형

enum RecursionMode { Recursive, NonRecursive }

공개 함수

QReadWriteLock(QReadWriteLock::RecursionMode recursionMode = NonRecursive)
~QReadWriteLock()
void lockForRead()
void lockForWrite()
bool tryLockForRead(int timeout)
(since 6.6) bool tryLockForRead(QDeadlineTimer timeout = {})
bool tryLockForWrite(int timeout)
(since 6.6) bool tryLockForWrite(QDeadlineTimer timeout = {})
void unlock()

상세 설명

읽기-쓰기 잠금은 읽기 및 쓰기 목적으로 액세스할 수 있는 리소스를 보호하기 위한 동기화 도구입니다. 이 유형의 잠금은 여러 스레드가 동시에 읽기 전용 액세스를 할 수 있도록 허용하려는 경우에 유용하지만, 하나의 스레드가 리소스에 쓰기를 시도하는 즉시 쓰기가 완료될 때까지 다른 모든 스레드는 차단되어야 합니다.

대부분의 경우, QReadWriteLock은 QMutex 의 직접적인 경쟁자입니다. 동시 읽기 작업이 많고 쓰기 작업이 드물게 발생하는 경우 QReadWriteLock을 사용하는 것이 좋습니다.

예시:

QReadWriteLock lock;

void ReaderThread::run()
{
    //...
    lock.lockForRead();
    read_file();
    lock.unlock();
    //...
}

void WriterThread::run()
{
    //...
    lock.lockForWrite();
    write_file();
    lock.unlock();
    //...
}

쓰기 스레드가 읽기 스레드에 의해 영구적으로 차단되는 것을 방지하기 위해, 현재 다른 읽기 스레드만 잠금을 사용하고 있더라도 접근을 기다리는 차단된 쓰기 스레드가 있는 경우, 잠금을 획득하려는 읽기 스레드의 시도는 성공하지 못합니다. 또한, 한 쓰기 스레드가 잠금을 사용하고 있는 중에 다른 쓰기 스레드가 접근하면, 해당 쓰기 스레드는 대기 중인 모든 읽기 스레드보다 우선권을 갖게 됩니다.

QMutex 와 마찬가지로, QReadWriteLock은 QReadWriteLock::Recursive 를 사용하여 생성된 경우 QReadWriteLock::RecursionMode 와 같이 동일한 스레드에서 재귀적으로 잠글 수 있습니다. 이러한 경우, unlock()는 lockForWrite() 또는 lockForRead()가 호출된 횟수와 동일한 횟수만큼 호출되어야 합니다. 재귀적으로 잠금을 시도할 때는 잠금 유형을 변경할 수 없다는 점에 유의하십시오. 즉, 이미 쓰기 잠금을 설정한 스레드에서 읽기 잠금을 설정할 수 없으며(반대의 경우도 마찬가지입니다).

QReadLocker, QWriteLocker, QMutex 및 QSemaphore도 참조하십시오 .

멤버 유형 문서

enum QReadWriteLock::RecursionMode

상수값설명
QReadWriteLock::Recursive1이 모드에서는 스레드가 동일한 ` QReadWriteLock `을 여러 번 잠글 수 있습니다. 해당 횟수만큼 ` unlock()` 호출이 수행될 때까지 ` QReadWriteLock `의 잠금은 해제되지 않습니다.
QReadWriteLock::NonRecursive0이 모드에서는 스레드가 QReadWriteLock 를 한 번만 잠글 수 있습니다.

QReadWriteLock()도 참조하십시오 .

멤버 함수 문서

[explicit] QReadWriteLock::QReadWriteLock(QReadWriteLock::RecursionMode recursionMode = NonRecursive)

지정된 recursionMode 에서 QReadWriteLock 객체를 생성합니다.

기본 재귀 모드는 NonRecursive 입니다.

lockForRead(), lockForWrite() 및 RecursionMode도 참조하십시오 .

[noexcept] QReadWriteLock::~QReadWriteLock()

QReadWriteLock 객체를 삭제합니다.

경고: 사용 중인 읽기-쓰기 잠금을해제하면 정의되지 않은 동작이 발생할 수 있습니다.

void QReadWriteLock::lockForRead()

잠금을 읽기 전용으로 설정합니다. 다른 스레드가 쓰기 전용으로 잠근 상태라면, 이 함수는 현재 스레드를 차단합니다.

스레드가 이미 쓰기 잠금을 걸고 있는 경우 읽기 잠금을 걸 수 없습니다.

unlock(), lockForWrite(), tryLockForRead()도 참조하십시오 .

void QReadWriteLock::lockForWrite()

잠금을 쓰기 전용으로 잠급니다. 이 함수는 다른 스레드(현재 스레드 포함)가 읽기 또는 쓰기 전용으로 잠근 상태라면 현재 스레드를 차단합니다( QReadWriteLock::Recursive 모드로 잠금이 생성된 경우는 제외).

스레드가 이미 읽기 잠금을 걸고 있는 경우, 쓰기 잠금을 걸 수 없습니다.

unlock(), lockForRead(), tryLockForWrite()도 참조하십시오 .

bool QReadWriteLock::tryLockForRead(int timeout)

읽기용 잠금을 시도합니다. 이 함수는 잠금을 획득한 경우 ` true `를 반환하고, 그렇지 않은 경우 ` false`를 반환합니다. 다른 스레드가 쓰기용 잠금을 획득한 상태라면, 이 함수는 잠금이 해제될 때까지 최대 ` timeout ` 밀리초 동안 대기합니다.

참고: timeout 매개변수로 음수를 전달하는 것은 lockForRead()를 호출하는 것과 동일합니다. 즉, timeout 가 음수일 경우 이 함수는 잠금을 읽기 모드로 획득할 수 있을 때까지 무한정 대기합니다.

잠금을 획득한 경우, 다른 스레드가 쓰기용으로 성공적으로 잠글 수 있으려면 먼저 unlock()를 호출하여 잠금을 해제해야 합니다.

스레드가 이미 쓰기 용도로 잠금을 획득한 상태라면 읽기 용도로 잠금을 획득할 수 없습니다.

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

[since 6.6] bool QReadWriteLock::tryLockForRead(QDeadlineTimer timeout = {})

읽기 잠금을 시도합니다. 이 함수는 잠금을 획득한 경우 ` true `를 반환하고, 그렇지 않은 경우 ` false`를 반환합니다. 다른 스레드가 쓰기 잠금을 걸고 있는 경우, 이 함수는 ` timeout `가 만료되어 잠금이 사용 가능해질 때까지 대기합니다.

잠금이 획득된 경우, 다른 스레드가 쓰기 용도로 성공적으로 잠금을 획득하려면 먼저 unlock()을 호출하여 잠금을 해제해야 합니다.

스레드가 이미 쓰기 용도로 잠금을 획득한 상태에서는 읽기 용도로 잠금을 획득할 수 없습니다.

이 함수는 오버로드된 함수입니다.

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

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

bool QReadWriteLock::tryLockForWrite(int timeout)

쓰기 잠금을 시도합니다. 이 함수는 잠금을 획득한 경우 ` true `를 반환하고, 그렇지 않은 경우 ` false`를 반환합니다. 다른 스레드가 읽기 또는 쓰기 잠금을 걸고 있는 경우, 이 함수는 잠금이 해제될 때까지 최대 ` timeout ` 밀리초 동안 대기합니다.

참고: timeout 로 음수를 전달하는 것은 lockForWrite()을 호출하는 것과 동일합니다. 즉, timeout 가 음수인 경우 이 함수는 쓰기용 잠금을 획득할 수 있을 때까지 무한정 대기합니다.

잠금을 획득한 경우, 다른 스레드가 성공적으로 잠글 수 있으려면 unlock()를 사용하여 잠금을 해제해야 합니다.

스레드가 이미 읽기 잠금을 설정해 놓은 상태에서는 쓰기 잠금을 설정할 수 없습니다.

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

[since 6.6] bool QReadWriteLock::tryLockForWrite(QDeadlineTimer timeout = {})

쓰기용 잠금을 시도합니다. 이 함수는 잠금을 획득한 경우 ` true `을 반환하고, 그렇지 않은 경우 ` false`을 반환합니다. 다른 스레드가 읽기 또는 쓰기용으로 잠금을 획득한 경우, 이 함수는 ` timeout `이 만료되어 잠금이 사용 가능해질 때까지 대기합니다.

잠금을 획득한 경우, 다른 스레드가 성공적으로 잠금을 획득하려면 먼저 unlock()를 호출하여 잠금을 해제해야 합니다.

스레드가 이미 읽기 잠금을 걸고 있는 경우, 쓰기 잠금을 걸 수는 없습니다.

이 함수는 오버로드된 함수입니다.

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

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

void QReadWriteLock::unlock()

자물쇠를 엽니다.

잠겨 있지 않은 자물쇠를 잠금 해제하려고 하면 오류가 발생하며, 프로그램이 종료됩니다.

lockForRead(), lockForWrite(), tryLockForRead() 및 tryLockForWrite()도 참조하십시오 .

© 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.