QWaitCondition Class

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

Header: #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()

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

wakeOne()も参照のこと

void QWaitCondition::wakeOne()

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

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

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

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