QWaitCondition Class

QWaitCondition クラスは、スレッドを同期させるための条件変数を提供します。詳細...

ヘッダー #include <QWaitCondition>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

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

パブリック関数

QWaitCondition()
~QWaitCondition()
void notify_all()
void notify_one()
bool wait(QMutex *lockedMutex, QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))
bool wait(QReadWriteLock *lockedReadWriteLock, QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))
bool wait(QMutex *lockedMutex, unsigned long time)
bool wait(QReadWriteLock *lockedReadWriteLock, unsigned long time)
void wakeAll()
void wakeOne()

詳細説明

QWaitCondition は、スレッドが何らかの条件が満たされたことを他のスレッドに伝えることを可能にする。1つまたは多数のスレッドは、wakeOne ()またはwakeAll ()を使用して、QWaitConditionが条件を設定するのを待つためにブロックすることができます。ランダムに選ばれた1つのスレッドを目覚めさせるにはwakeOne ()を使用し、すべてのスレッドを目覚めさせるにはwakeAll ()を使用する。

たとえば、ユーザーがキーを押すたびに実行される3つのタスクがあるとします。各タスクはスレッドに分割することができ、それぞれのスレッドは次のようなrun ()ボディを持つ:

forever {
    mutex.lock();
    keyPressed.wait(&mutex);
    do_something();
    mutex.unlock();
}

ここで、keyPressed 変数は QWaitCondition 型のグローバル変数である。

第4のスレッドはキー入力を読み取り、それを受け取るたびに他の3つのスレッドを起こす:

forever {
    getchar();
    keyPressed.wakeAll();
}

つのスレッドが起動する順番は不定である。また、キーが押されたときにスレッドのいくつかがまだdo_something() 、それらのスレッドはウェイクアップされない(条件変数で待機していないため)。この問題は、カウンターとQMutex を使って解決できる。例えば、これがワーカースレッドの新しいコードです:

forever {
    mutex.lock();
    keyPressed.wait(&mutex);
    ++count;
    mutex.unlock();

    do_something();

    mutex.lock();
    --count;
    mutex.unlock();
}

これが4番目のスレッドのコードだ:

forever {
    getchar();

    mutex.lock();
    // Sleep until there are no busy worker threads
    while (count > 0) {
        mutex.unlock();
        sleep(1);
        mutex.lock();
    }
    keyPressed.wakeAll();
    mutex.unlock();
}

ミューテックスが必要なのは、2つのスレッドが同時に同じ変数の値を変更しようとすると、その結果が予測できないからだ。

待機条件は、強力なスレッド同期プリミティブです。待機条件を使用するプロデューサとコンシューマの例では、プロデューサ・スレッドとコンシューマ・スレッドで共有される循環バッファへのアクセスを制御するために、QSemaphore の代替として QWaitCondition を使用する方法を示しています。

QMutex,QSemaphore,QThread, およびProducer and Consumer using Wait Conditionsも参照してください

メンバ関数ドキュメント

QWaitCondition::QWaitCondition()

新しい待機条件オブジェクトを構築する。

[noexcept] QWaitCondition::~QWaitCondition()

待機状態オブジェクトを破棄する。

void QWaitCondition::notify_all()

この関数は STL との互換性のために提供されている。wakeAll() と同等です。

void QWaitCondition::notify_one()

この関数は STL との互換性のために提供されている。wakeOne() と同等です。

bool QWaitCondition::wait(QMutex *lockedMutex, QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))

lockedMutex を解放し、待機条件で待つ。lockedMutex は、呼び出し元のスレッドによって最初にロックされていなければならない。lockedMutex がロック状態でない場合、動作は未定義である。lockedMutex が再帰的ミューテックスの場合、この関数は即座に戻る。lockedMutex はロック解除され、呼び出し元のスレッドは、これらの条件のいずれかが満たされるまでブロックされる:

  • 別のスレッドがwakeOne() またはwakeAll() を使用してシグナルを送る。この場合、この関数はtrueを返す。
  • deadline で指定された期限に達した。deadlineQDeadlineTimer::Forever (デフォルト)である場合、wait はタイムアウトしません (イベントはシグナルされなければなりません)。待ち時間がタイムアウトした場合、この関数は偽を返します。

lockedMutex は同じロック状態に戻される。この関数は、ロック状態から待機状態へのアトミックな遷移を可能にするために用意されている。

wakeOne() およびwakeAll()も参照のこと

bool QWaitCondition::wait(QReadWriteLock *lockedReadWriteLock, QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))

lockedReadWriteLock を解放し、待機条件で待つ。lockedReadWriteLock は、呼び出し元のスレッドによって最初にロックされていなければならない。lockedReadWriteLock がロック状態でない場合、この関数は直ちに戻る。lockedReadWriteLock を再帰的にロックしてはならない。さもないと、この関数はロックを適切に解放しない。lockedReadWriteLock はロック解除され、呼び出し元のスレッドはこれらの条件のいずれかが満たされるまでブロックされる:

  • 別のスレッドがwakeOne() またはwakeAll() を使用してシグナルを送る。この場合、この関数はtrueを返す。
  • deadline で指定された期限に達した。deadlineQDeadlineTimer::Forever (デフォルト)である場合、wait はタイムアウトしません (イベントはシグナルされなければなりません)。待ち時間がタイムアウトした場合、この関数は偽を返します。

lockedReadWriteLock は同じロック状態に戻される。この関数は、ロック状態から待機状態へのアトミックな遷移を可能にするために用意されている。

wakeOne() およびwakeAll()も参照のこと

bool QWaitCondition::wait(QMutex *lockedMutex, unsigned long time)

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

lockedMutex を解放し、time ミリ秒待機する。

bool QWaitCondition::wait(QReadWriteLock *lockedReadWriteLock, unsigned long time)

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

lockedReadWriteLock を解放し、time ミリ秒待機する。

void QWaitCondition::wakeAll()

wait条件で待機しているすべてのスレッドを起動する。スレッドが起動される順番はオペレーティングシステムのスケジューリングポリシーに依存し、制御や予測はできない。

wakeOne()も参照のこと

void QWaitCondition::wakeOne()

待ち状態で待機しているスレッドを1つ起こす。ウェイクアップされるスレッドはオペレーティングシステムのスケジューリングポリシーに依存し、制御したり予測したりすることはできません。

特定のスレッドをウェイクアップさせたい場合は、通常、異なる待機条件を使用し、異なるスレッドを異なる条件で待機させることで解決する。

wakeAll()も参照のこと

© 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.