QMutex Class
QMutex クラスは、スレッド間のアクセスシリアライゼーションを実現します。詳細...
| ヘッダー: | #include <QMutex> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
- 継承されたメンバーを含む、すべてのメンバーの一覧
- QMutex はスレッド関連クラスの一部です。
注:このクラスのすべての関数はスレッドセーフです。
パブリック関数
| QMutex() | |
| ~QMutex() | |
| void | lock() |
(since 6.6) bool | tryLock(QDeadlineTimer timer) |
| bool | tryLock(int timeout) |
| bool | tryLock() |
| bool | try_lock() |
| bool | try_lock_for(std::chrono::duration<Rep, Period> duration) |
| bool | try_lock_until(std::chrono::time_point<Clock, Duration> timePoint) |
| void | unlock() |
詳細な説明
QMutex の目的は、オブジェクト、データ構造、またはコードのセクションを保護し、一度に 1 つのスレッドだけがアクセスできるようにすることです(これは、Java の `synchronized ` キーワードに似ています)。通常、QMutexLocker と組み合わせてミュテックスを使用するのが最適です。これにより、ロックとロック解除が一貫して実行されることを容易に保証できるからです。
たとえば、ユーザーに2行のメッセージを出力するメソッドがあるとします。
int number = 6;
void method1()
{
number *= 5;
number /= 4;
}
void method2()
{
number *= 3;
number /= 2;
}これら2つのメソッドが連続して呼び出されると、次のようなことが起こります:
// method1()
number *= 5; // number is now 30
number /= 4; // number is now 7
// method2()
number *= 3; // number is now 21
number /= 2; // number is now 10これら2つのメソッドが2つのスレッドから同時に呼び出された場合、次のようなシーケンスが生じる可能性があります:
// Thread 1 calls method1()
number *= 5; // number is now 30
// Thread 2 calls method2().
//
// Most likely Thread 1 has been put to sleep by the operating
// system to allow Thread 2 to run.
number *= 3; // number is now 90
number /= 2; // number is now 45
// Thread 1 finishes executing.
number /= 4; // number is now 11, instead of 10ミューテックスを追加すれば、期待通りの結果が得られるはずです:
QMutex mutex;
int number = 6;
void method1()
{
mutex.lock();
number *= 5;
number /= 4;
mutex.unlock();
}
void method2()
{
mutex.lock();
number *= 3;
number /= 2;
mutex.unlock();
}そうすれば、任意の時点でnumber を変更できるスレッドは1つだけとなり、結果は正しくなります。もちろんこれは単純な例ですが、特定の順序で処理が行われる必要がある他のあらゆるケースにも当てはまります。
あるスレッドで `lock()` を呼び出した場合、同じ場所で `lock()` を呼び出そうとする他のスレッドは、ロックを取得したスレッドが `unlock()` を呼び出すまでブロックされます。`lock()` の非ブロッキング版として、`tryLock()` があります。
QMutexは、競合が発生しない場合に高速に動作するよう最適化されています。そのミューテックスで競合が発生していない場合、メモリは割り当てられません。生成および破棄時のオーバーヘッドはほぼゼロであるため、他のクラスの一部として多数のミューテックスを保持しても問題ありません。
QRecursiveMutex 、QMutexLocker 、QReadWriteLock 、QSemaphore 、およびQWaitConditionも参照してください 。
メンバ関数のドキュメント
[constexpr noexcept default] QMutex::QMutex()
新しいミューテックスを構築します。このミューテックスは、ロックされていない状態で作成されます。
[noexcept] QMutex::~QMutex()
ミューテックスを破棄します。
警告: ロックされているミューテックスを破棄すると 、未定義の挙動が生じる可能性があります。
[noexcept(...)] void QMutex::lock()
ミューテックスをロックします。別のスレッドがすでにミューテックスをロックしている場合、この呼び出しは、そのスレッドがロックを解除するまでブロックされます。
もしミュテックスがすでに現在のスレッドによってロックされている場合、この呼び出しは決して戻らず、デッドロックを引き起こします。
注: FutexAlwaysAvailable がtrue の場合、この関数はnoexceptとなります 。
unlock()も参照してください 。
[noexcept(...), since 6.6] bool QMutex::tryLock(QDeadlineTimer timer)
ミューテックスをロックしようと試みます。この関数は、ロックに成功した場合はtrue を返し、失敗した場合はfalse を返します。別のスレッドがミューテックスをロックしている場合、この関数はtimer が期限切れになるまで待機し、ミューテックスが利用可能になるのを待ちます。
ロックが取得された場合、別のスレッドが正常にロックを行うには、unlock() を使用してミューテックスをアンロックする必要があります。
この関数は Qt 6.6 で導入されました。
注: FutexAlwaysAvailable がtrue の場合、この関数はnoexceptとなります 。
[noexcept(...)] bool QMutex::tryLock(int timeout)
ミューテックスをロックしようと試みます。この関数は、ロックに成功した場合はtrue を返し、失敗した場合はfalse を返します。別のスレッドがミューテックスをロックしている場合、この関数はミューテックスが利用可能になるまで、最大timeout ミリ秒待機します。
注:timeout として負の数を渡すことは、lock() を呼び出すことと同じです。つまり、timeout が負の場合、この関数はミューテックスがロック可能になるまで無限に待機します。
ロックが取得された場合、別のスレッドが正常にロックを行うには、unlock() を使用してミューテックスをロック解除する必要があります。
注: FutexAlwaysAvailable がtrue の場合、この関数は noexcept です。
[noexcept] bool QMutex::tryLock()
ミューテックスをロックしようと試みます。この関数は、ロックに成功した場合はtrue を返し、失敗した場合はfalse を返します。
ロックが取得された場合、別のスレッドが正常にロックを行うには、unlock() を使用してミューテックスをアンロックする必要があります。
これはオーバーロードされた関数です。
[noexcept] bool QMutex::try_lock()
ミューテックスをロックしようと試みます。この関数は、ロックが取得できた場合はtrue を返し、そうでない場合はfalse を返します。
この関数は、標準ライブラリの概念である `Lockable` との互換性を確保するために提供されています。これは `tryLock()` と同等です。
template <typename Rep, typename Period> bool QMutex::try_lock_for(std::chrono::duration<Rep, Period> duration)
ミューテックスをロックしようと試みます。この関数は、ロックに成功した場合はtrue を返し、失敗した場合はfalse を返します。別のスレッドがミューテックスをロックしている場合、この関数はミューテックスが利用可能になるまで、少なくともduration の間待機します。
注:duration として負の時間を指定することは、try_lock() を呼び出すのと同じです。この動作はtryLock() とは異なります。
ロックが取得された場合、別のスレッドが正常にロックを行うには、unlock() を使用してミューテックスをアンロックする必要があります。
template <typename Clock, typename Duration> bool QMutex::try_lock_until(std::chrono::time_point<Clock, Duration> timePoint)
ミューテックスをロックしようと試みます。この関数は、ロックに成功した場合はtrue を返し、失敗した場合はfalse を返します。別のスレッドがミューテックスをロックしている場合、この関数はtimePoint が経過するまで、ミューテックスが利用可能になるのを待機します。
注:すでに期限が切れたtimePoint を渡すことは、try_lock()を呼び出すことと同じです。この動作はtryLock()とは異なります。
ロックが取得された場合、別のスレッドが正常にロックを行うには、unlock() を使用してそのミューテックスをアンロックする必要があります。
[noexcept] void QMutex::unlock()
ミューテックスをアンロックします。ロックを行ったスレッドとは異なるスレッドでミューテックスのアンロックを試みると、エラーが発生します。ロックされていないミューテックスをアンロックすると、未定義の挙動となります。
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.