QMutexLocker Class

template <typename Mutex> class QMutexLocker

QMutexLocker クラスは、ミューテックスのロックとアンロックを簡略化する便利なクラスです。詳細...

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

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

パブリック関数

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)

詳細説明

複雑な関数やステートメント、あるいは例外処理コードの中でQMutexQRecursiveMutex をロックしたりアンロックしたりすることは、エラーが発生しやすくデバッグが困難です。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());
        ...
    }
};

QReadLockerQWriteLockerQMutexも参照して ください。

メンバ関数 ドキュメント

[explicit noexcept] QMutexLocker::QMutexLocker(Mutex *mutex)

QMutexLocker を構築し、mutex をロックします。QMutexLocker が破棄されると、ミューテックスはアンロックされます。mutexnullptr の場合、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 が関連付けられたミューテックスを現在ロックしている場合は true を返し、そうでない場合は false を返します。

この関数は 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-assignsother をこのQMutexLocker に割り当てます。割り当て前にQMutexLocker がロックされたミューテックスを保持していた場合、そのミューテッ クスはアンロックされる。その後、ミューテックスとother の状態がこのQMutexLocker に転送される。移動後、other はミューテックスを管理しなくなります。

この関数はQt 6.4で導入されました。

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

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