QReadWriteLock Class

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

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

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

공용 유형

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::RecursiveQReadWriteLock::RecursionMode 과 함께 구성하면 동일한 스레드에서 재귀적으로 QReadWriteLock을 잠글 수 있습니다. 이러한 경우 unlock()는 lockForWrite() 또는 lockForRead()가 호출된 횟수와 동일한 횟수만큼 호출되어야 합니다. 재귀적으로 잠그려고 할 때는 잠금 유형을 변경할 수 없습니다. 즉, 이미 쓰기용으로 잠긴 스레드에서 읽기용으로 잠글 수 없으며 그 반대의 경우도 마찬가지입니다.

QReadLocker, QWriteLocker, QMutex, QSemaphore참조하세요 .

멤버 유형 문서

enum QReadWriteLock::RecursionMode

상수설명
QReadWriteLock::Recursive1이 모드에서는 스레드가 동일한 QReadWriteLock 을 여러 번 잠글 수 있습니다. QReadWriteLock 은 해당 횟수의 unlock() 호출이 이루어질 때까지 잠금이 해제되지 않습니다.
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()도 참조하세요 .

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