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();
    ...
}

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

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() も参照して ください。

©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。