QReadWriteLock Class

QReadWriteLockクラスは、読み書きロックを提供します。詳細...

ヘッダー #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();
    ...
}

例:ライタがリーダによって永遠にブロックされないようにするため、ロックを取得しようとするリーダは、そのロックが現在他のリーダによってのみアクセスされている場合でも、アクセスを待っているブロックされたライタがある場合は成功しません。また、あるライターがロックにアクセスした後、別のライターが入ってきた場合、そのライターは、同じく待機している可能性のあるリーダーよりも優先されます。

QReadWriteLock は、QMutex と同様に、QReadWriteLock::Recursive を使用してQReadWriteLock::RecursionMode を構築すると、同じスレッドによって再帰的にロックされる可能性があります。このような場合、lockForWrite ()またはlockForRead ()が呼び出された回数と同じ回数、unlock ()を呼び出す必要がある。再帰的にロックしようとする場合、ロックの種類を変更できないことに注意すること。

QReadLockerQWriteLockerQMutexQSemaphoreも参照のこと

メンバー・タイプ・ドキュメント

enum QReadWriteLock::RecursionMode

定数説明
QReadWriteLock::Recursive1このモードでは、スレッドは同じQReadWriteLock を複数回ロックできる。unlock() の呼び出しが対応する回数行われるまで、QReadWriteLock のロックは解除されない。
QReadWriteLock::NonRecursive0このモードでは、スレッドはQReadWriteLock を 1 回だけロックできる。

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.