QWaitCondition
提供一个用于同步线程的条件变量。更多...
属性 | 内容 |
---|---|
头文件 | #include<QWaitCondition> |
qmake | QT += core |
注意: 此类中所有函数都是线程安全的。
返回类型 | 函数 |
---|---|
QWaitCondition() | |
~QWaitCondition() | |
void | notify_all() |
void | notify_one() |
bool | wait(QMutex *lockedMutex, QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever)) |
bool | wait(QMutex *lockedMutex, unsigned long time) |
bool | wait(QReadWriteLock *lockedReadWriteLock, QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever)) |
bool | wait(QReadWriteLock *lockedReadWriteLock, unsigned long time) |
void | wakeAll() |
void | wakeOne() |
QWaitCondition
允许线程告诉其他线程某种条件已经满足。一个或多个线程可以被阻塞并等待 QWaitCondition
用 wakeOne() 或 wakeAll() 设置条件。使用 wakeOne() 唤醒一个随机选择的线程,或使用 wakeAll() 唤醒所有线程。
例,假设我们有三个任务,当用户按下一个键时,应该执行某些任务。每个任务可以分成一个线程,每个线程都有一个 run() 主体,如下所示:
forever {
mutex.lock();
keyPressed.wait(&mutex);
do_something();
mutex.unlock();
}
这里,keyPressed
变量是 QWaitCondition
类型的全局变量。
第四个线程将读取按键,并在每次收到按键时唤醒其他三个线程,如下所示:
forever {
getchar();
keyPressed.wakeAll();
}
唤醒三个线程的顺序是未知的。另外,如果某些线程在按下键时仍在 do_something()
中,它们将不会被唤醒(因为它们没有等待条件变量),因此该按键不会执行任务。这个问题可以通过使用计数器和 QMutex() 来解决。例如,下面是工作线程的新代码:
forever {
mutex.lock();
keyPressed.wait(&mutex);
++count;
mutex.unlock();
do_something();
mutex.lock();
--count;
mutex.unlock();
}
下面是第四个线程的代码:
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();
}
互斥量是必需的,因为当两个线程同时更改同一变量的值时,结果是不可预测的。
等待条件是一个强大的线程同步原语。Wait Conditions示例演示了如何使用 QWaitCondition
作为 QSemaphore() 的替代品,来控制生产者消费者的共享循环缓冲区的访问。
另请参阅: QMutex、QSemaphore、QThread() 和 Wait Conditions示例。
构造。
析构。
用于STL兼容。它相当于 wakeAll()。
在 Qt 5.8 引入该函数。
用于STL兼容。它相当于 wakeOne()。
在 Qt 5.8 引入该函数。
释放 lockedMutex
并等待条件。lockedMutex
最初必须由调用线程锁定。如果 lockedMutex
未处于锁定状态,则行为未定义。如果 lockedMutex
是递归互斥体,则此函数将立即返回。lockedMutex
将被解锁,调用线程将阻塞,直到满足以下任一条件:
deadline
是默认值 QDeadlineTimer::Forever
,则永远不会超时(必须用信号通知事件)。如果等待超时,此函数将返回false。 lockedMutex
将返回到相同的锁定状态。提供此函数是为了允许原子从锁定状态转换到等待状态。
在 Qt 5.12 引入该函数。
重载。
释放 lockedReadWriteLock
并等待条件。lockedReadWriteLock
最初必须由调用线程锁定。如果 lockedReadWriteLock
未处于锁定状态,则此函数将立即返回。 lockedReadWriteLock
不能递归锁定,否则此函数将无法正确释放锁。lockedReadWriteLock
将被解锁,调用线程将阻塞,直到满足以下任一条件:
deadline
是默认值 QDeadlineTimer::Forever
,则永远不会超时(必须用信号通知事件)。如果等待超时,此函数将返回false。 lockedReadWriteLock
将返回到相同的锁定状态。提供此函数是为了允许原子从锁定状态转换到等待状态。
在 Qt 5.12 引入该函数。
重载。
唤醒等待条件的所有线程。线程的唤醒顺序取决于操作系统的调度策略,无法控制或预测。
另请参阅: wakeOne()。
唤醒一个等待条件的线程。线程的唤醒顺序取决于操作系统的调度策略,无法控制或预测。
如果要唤醒特定线程,解决方案通常是使用不同的等待条件,并让线程在不同的条件下等待。
另请参阅: wakeAll()。
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )