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) |
詳細な説明
QMutexLocker はテンプレートクラスであり、テンプレートパラメータMutex は、ロックおよびロック解除の対象となるミューテックス型(QMutex やQRecursiveMutex など)を指定します。
複雑な関数や文、あるいは例外処理コード内で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 は何も行いません。
注: LockIsNoexcept がtrue の場合、この関数は noexcept です。
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 が現在、関連付けられたミューテックスをロックしている場合はtrueを返し、そうでない場合はfalseを返します。
この関数は Qt 6.4 で導入されました。
Mutex *QMutexLocker::mutex() const
QMutexLocker が操作対象としているミューテックスを返します。
[noexcept(...)] void QMutexLocker::relock()
ロックが解除されたミューテックス・ロッカーを再ロックします。
注: LockIsNoexcept がtrue の場合、この関数はnoexceptとなります 。
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)
other をこのQMutexLocker に移動代入します。もしこのQMutexLocker が代入前にロックされたミューテックスを保持していた場合、そのミューテックスはロックが解除されます。その後、ミューテックスとother の状態は、このQMutexLocker に移管されます。移動後、other はもはやいかなるミューテックスも管理しなくなります。
この関数は Qt 6.4 で導入されました。
QMutex::lock()も参照してください 。
© 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.