QReadWriteLock Class
QReadWriteLock クラスは、読み書きロック機能を提供します。詳細...
| ヘッダー: | #include <QReadWriteLock> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| 継承元: | QBasicReadWriteLock |
- 継承されたメンバーを含むすべてのメンバーの一覧
- QReadWriteLock はスレッド関連クラスの一部です。
注:このクラスのすべての関数はスレッドセーフです。
パブリック型
| 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() |
詳細な説明
読み書きロックは、読み取りおよび書き込みのためにアクセス可能なリソースを保護するための同期ツールです。このタイプのロックは、複数のスレッドによる同時読み取りアクセスを許可したいが、1 つのスレッドがリソースへの書き込みを行おうとした時点で、書き込みが完了するまですべての他のスレッドをブロックする必要がある場合に役立ちます。
多くの場合、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::Recursive | 1 | このモードでは、スレッドは同じQReadWriteLock を複数回ロックすることができます。対応する回数のunlock()呼び出しが行われるまで、QReadWriteLock のロックは解除されません。 |
QReadWriteLock::NonRecursive | 0 | このモードでは、スレッドは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()も参照してください 。
© 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.