QMutex Class

QMutex クラスは、スレッド間のアクセス・シリアライズを提供します。詳細...

Header: #include <QMutex>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

注意:このクラスの関数はすべてスレッドセーフです。

パブリック関数

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 で導入されました。

lock() およびunlock()も参照してください

[noexcept] bool QMutex::tryLock(int timeout)

ミューテックスのロックを試みます。この関数は、ロックが得られた場合はtrue を返し、そうでない場合はfalse を返します。他のスレッドがミューテックスをロックしている場合、この関数は、ミューテックスが使用可能になるまで最大でtimeout ミリ秒待機します。

注意:timeout に負の数を渡すと、lock() を呼び出すのと同じことになる。つまり、timeout が負の場合、この関数はミューテックスがロックできるまで永遠に待つことになる。

ロックが取得された場合、他のスレッドが正常にロックできるようになる前に、unlock() でミューテックスをアンロックしなければならない。

同じスレッドから同じミューテックスに対してこの関数を複数回呼び出すと、デッドロックが発生する。

lock() およびunlock()も参照のこと

[noexcept] bool QMutex::tryLock()

これはオーバーロードされた関数です。

ミューテックスのロックを試みます。この関数は、ロックが得られた場合はtrue を返し、そうでない場合はfalse を返す。

ロックが取得された場合、他のスレッドが正常にロックする前に、unlock() でミューテックスのロックを解除する必要がある。

同じスレッドから同じミューテックスに対してこの関数を複数回呼び出すと、デッドロックが発生する。

lock() および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() でロックを解除しなければならない。

同じスレッドから同じミューテックスに対してこの関数を複数回呼び出すと、デッドロックが 発生する。

lock() および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() でロックを解除しなければならない。

同じスレッドから同じミューテックスに対してこの関数を複数回呼び出すと、デッドロックが 発生する。

lock() およびunlock()も参照のこと

[noexcept] void QMutex::unlock()

ミューテックスのロックを解除する。ロックしたスレッドとは別のスレッドでミューテックスのロックを解除しようとすると、エラーになります。ロックされていないミューテックスのロックを解除すると、未定義の動作になります。

lock()も参照してください

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。