QWaitCondition Class
QWaitCondition クラスは、スレッドの同期を行うための条件変数を用意しています。詳細...
| ヘッダー: | #include <QWaitCondition> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
- 継承されたメンバーを含む、すべてのメンバーの一覧
- QWaitConditionはスレッド関連クラスの一部です。
注:このクラスのすべての関数はスレッドセーフです。
パブリック関数
| 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 つまたは複数のスレッドが、QWaitCondition がwakeOne() またはwakeAll() を使用して条件を設定するのを待機してブロックすることができます。wakeOne() を使用すると、ランダムに選択された 1 つのスレッドを起動し、wakeAll() を使用すると、すべてのスレッドを起動します。
たとえば、ユーザーがキーを押すたびに実行されるべき3つのタスクがあるとします。各タスクはスレッドに分割でき、それぞれのスレッドには次のようなrun()の本体が含まれます。
forever {
mutex.lock();
keyPressed.wait(&mutex);
do_something();
mutex.unlock();
}ここで、keyPressed 変数はQWaitCondition型のグローバル変数です。
4つ目のスレッドはキー入力を読み取り、入力があるたびに他の3つのスレッドを次のように目覚めさせます:
forever {
getchar();
keyPressed.wakeAll();
}3つのスレッドがどの順序で目覚めさせられるかは未定義です。また、キーが押された時点で一部のスレッドがまだ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 、および「 Wait条件を使用したプロデューサーとコンシューマー」。
メンバ関数のドキュメント
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 で指定された期限に達した場合。deadline が
QDeadlineTimer::Forever(デフォルト)に設定されている場合、待機はタイムアウトすることはありません(イベントがシグナルされる必要があります)。待機がタイムアウトした場合は、この関数はfalseを返します。
lockedMutex は、ロックされた状態のまま返されます。この関数は、ロック状態から待機状態へのアトミックな遷移を可能にするために提供されています。
wakeOne() およびwakeAll()も参照してください 。
bool QWaitCondition::wait(QReadWriteLock *lockedReadWriteLock, QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))
lockedReadWriteLock を解放し、待機条件を満たすまで待機します。lockedReadWriteLock は、呼び出し元スレッドによって最初にロックされている必要があります。lockedReadWriteLock がロックされていない場合、この関数は直ちに返ります。lockedReadWriteLock を再帰的にロックしてはなりません。そうしないと、この関数はロックを適切に解放できなくなります。lockedReadWriteLock のロックは解除され、呼び出し元スレッドは以下のいずれかの条件が満たされるまでブロックされます:
- 別のスレッドが、wakeOne() またはwakeAll() を使用してシグナルを送信する。この場合、この関数は true を返す。
- deadline で指定された期限に達した場合。deadline が
QDeadlineTimer::Forever(デフォルト)に設定されている場合、待機はタイムアウトすることはありません(イベントがシグナルされなければなりません)。待機がタイムアウトした場合、この関数はfalseを返します。
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()も参照してください 。
© 2026 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.