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 つのスレッドのみがアクセスできるようにすることです(これは Javasynchronized
キーワードに似ています)。ロックとアンロックが一貫して実行されるようにするのが簡単なので、通常は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は、非コンテントの場合に高速になるように最適化されています。QMutexは、そのミューテックスに競合がなければ、メモリを割り当てません。QMutexはほとんどオーバーヘッドなしで構築、破棄されるので、他のクラスの一部として多くのミューテックスを持っていても問題ありません。
QRecursiveMutex,QMutexLocker,QReadWriteLock,QSemaphore,QWaitConditionも参照のこと 。
メンバ関数ドキュメント
[constexpr noexcept]
QMutex::QMutex()
新しいミューテックスを構築する。ミューテックスはアンロック状態で作成される。
[noexcept]
QMutex::~QMutex()
ミューテックスを破棄する。
警告 ロックされたミューテックスを破棄すると、未定義の動作になる可能性があります。
[noexcept]
void QMutex::lock()
ミューテックスをロックする。他のスレッドがミューテックスをロックしている場合、そのスレッドがロックを解除するまで、この呼び出しはブロックされる。
同じスレッドから同じミューテックスに対してこの関数を複数回呼び出すと、デッドロックが発生する。
unlock()も参照のこと 。
[noexcept, since 6.6]
bool QMutex::tryLock(QDeadlineTimer timer)
ミューテックスのロックを試みる。この関数は、ロックが得られた場合はtrue
を返し、そうでない場合はfalse
を返す。他のスレッドがミューテックスをロックしている場合、この関数はtimer の期限が切れるまで、ミューテックスが使用可能になるまで待機する。
ロックが取得された場合、他のスレッドがミューテックスを正常にロックする前に、unlock() でロックを解除しなければならない。
同じスレッドから同じミューテックスに対してこの関数を複数回呼び出すと、デッドロックが発生します。
この関数は Qt 6.6 で導入されました。
[noexcept]
bool QMutex::tryLock(int timeout)
ミューテックスのロックを試みる。この関数は、ロックが得られた場合はtrue
を返し、そうでない場合はfalse
を返す。他のスレッドがミューテックスをロックしている場合、この関数は、ミューテックスが使用可能になるまで最大timeout ミリ秒待機する。
注意:timeout に負の数を渡すと、lock() を呼び出すのと同じことになる。つまり、timeout が負の場合、この関数はミューテックスがロックできるまで永遠に待つことになる。
ロックが取得された場合、他のスレッドが正常にロックできるようになる前に、unlock() でミューテックスをアンロックしなければならない。
同じスレッドから同じミューテックスに対してこの関数を複数回呼び出すと、デッドロックが発生する。
[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()も参照のこと 。
© 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.