QMutexLocker Class
template <typename Mutex> class QMutexLockerQMutexLocker クラスは、ミューテックスのロックとアンロックを簡略化する便利なクラスです。詳細...
ヘッダー | #include <QMutexLocker> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
- 継承メンバを含む全メンバのリスト
- QMutexLocker はスレッドクラスに属しています。
注意:このクラスの関数はすべてスレッドセーフです。
パブリック関数
QMutexLocker(Mutex *mutex) | |
(since 6.4) | QMutexLocker(QMutexLocker<Mutex> &&other) |
~QMutexLocker() | |
(since 6.4) bool | isLocked() const |
Mutex * | mutex() const |
void | relock() |
(since 6.4) void | swap(QMutexLocker<Mutex> &other) |
void | unlock() |
(since 6.4) QMutexLocker<Mutex> & | operator=(QMutexLocker<Mutex> &&other) |
詳細説明
複雑な関数やステートメント、または例外処理コードにおいて、QMutex またはQRecursiveMutex をロックしたりアンロックしたりすることは、エラーが発生しやすく、デバッグが困難です。QMutexLocker をこのような状況で使用すると、ミューテックスの状態が常に適切に定義されます。
QMutexLocker は、QMutex をロックする必要がある関数内で作成する必要があります。QMutexLocker が作成されると、ミューテックスがロックされます。unlock()
relock()
ロックされている場合、QMutexLocker が破棄されると、ミューテックスのロックは解除されます。
例えば、この複雑な関数は、関数に入るときにQMutex をロックし、すべての 終了点でミューテックスのロックを解除します:
int complexFunction(int flag) { mutex.lock(); int retVal = 0; switch (flag) { case 0: case 1: retVal = moreComplexFunction(flag); break; case 2: { int status = anotherFunction(); if (status < 0) { mutex.unlock(); return -2; } retVal = status + flag; } break; default: if (flag > 10) { mutex.unlock(); return -1; } break; } mutex.unlock(); return retVal; }
このサンプル関数は、開発するにつれて複雑になり、エラーが発生する可能性が高くなります。
QMutexLockerを使用することで、コードが大幅に簡素化され、読みやすくなります:
int complexFunction(int flag) { QMutexLocker locker(&mutex); int retVal = 0; switch (flag) { case 0: case 1: return moreComplexFunction(flag); case 2: { int status = anotherFunction(); if (status < 0) return -2; retVal = status + flag; } break; default: if (flag > 10) return -1; break; } return retVal; }
QMutexLockerオブジェクトが破棄されたとき(locker
は自動変数なので、関数が戻ったとき)、ミューテックスは常にアンロックされます。
同じ原則が、例外をスローしたりキャッチしたりするコードにも適用されます。ミューテックスをロックした関数でキャッチされなかった例外は、例外がスタックから呼び出し関数に渡される前に、ミューテックスのロックを解除する方法がありません。
QMutexLockerは、QMutexLockerが操作しているミューテックスを返すmutex()
メンバ関数も提供しています。これは、QWaitCondition::wait() など、ミューテックスにアクセスする必要があるコードに便利です。例えば
class SignalWaiter { private: QMutexLocker<QMutex> locker; public: SignalWaiter(QMutex *mutex) : locker(mutex) { } void waitForSignal() { ... while (!signalled) waitCondition.wait(locker.mutex()); ... } };
QReadLocker 、QWriteLocker 、およびQMutexも参照してください 。
メンバ関数のドキュメント
[explicit noexcept]
QMutexLocker::QMutexLocker(Mutex *mutex)
QMutexLocker を構築し、mutex をロックします。このミューテックスは、QMutexLocker が破棄されるとアンロックされます。mutex がnullptr
の場合、QMutexLocker は何もしません。
QMutex::lock()も参照してください 。
[noexcept, since 6.4]
QMutexLocker::QMutexLocker(QMutexLocker<Mutex> &&other)
移動-other から QMutexLocker を構築する。other のミューテックスとステー トは、新しく構築されたインスタンスに転送される。移動後、other はミューテックスを管理しなくなります。
この関数は Qt 6.4 で導入されました。
QMutex::lock()も参照してください 。
QMutexLocker::~QMutexLocker()
QMutexLocker を破棄し、コンストラクタでロックされていたミューテックスのロックを解除します。
QMutex::unlock()も参照 。
[noexcept, since 6.4]
bool QMutexLocker::isLocked() const
このQMutexLocker が関連するミューテックスを現在ロックしている場合は真を、そうでない場合は偽を返します。
この関数は Qt 6.4 で導入されました。
Mutex *QMutexLocker::mutex() const
QMutexLocker が操作しているミューテックスを返します。
[noexcept]
void QMutexLocker::relock()
ロックされていないミューテックス・ロッカーを再ロックする。
unlock()も参照 。
[noexcept, since 6.4]
void QMutexLocker::swap(QMutexLocker<Mutex> &other)
ミューテックスとこのQMutexLocker の状態をother と交換する。この操作は非常に高速で、失敗することはありません。
この関数は Qt 6.4 で導入されました。
QMutex::lock()も参照してください 。
[noexcept]
void QMutexLocker::unlock()
このミューテックス・ロッカーをアンロックする。relock()
、再びロックすることができます。破棄するときはロックする必要はありません。
relock()も参照のこと 。
[noexcept, since 6.4]
QMutexLocker<Mutex> &QMutexLocker::operator=(QMutexLocker<Mutex> &&other)
Move-assignother をこのQMutexLocker の上に割り当てる。割り当て前にこのQMutexLocker がロックされたミューテックスを保持していた場合、ミューテックスはアンロックされる。その後、other のミューテックスと状態が、このQMutexLocker に転送される。移動後、other はミューテックスを管理しなくなります。
この関数はQt 6.4で導入されました。
QMutex::lock()も参照してください 。
© 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.