1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/cryfeifei-QtDocumentCN

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
QWaitCondition.md 7.4 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Ryan-rlm Отправлено 18.10.2020 12:25 5262193

QWaitCondition

  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 允许线程告诉其他线程某种条件已经满足。一个或多个线程可以被阻塞并等待 QWaitConditionwakeOne() 或 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() 的替代品,来控制生产者消费者的共享循环缓冲区的访问。

另请参阅: QMutexQSemaphoreQThread() 和 Wait Conditions示例

成员函数文档

QWaitCondition::QWaitCondition()

  构造。


QWaitCondition::~QWaitCondition()

  析构。


void QWaitCondition::notify_all()

  用于STL兼容。它相当于 wakeAll()。
  在 Qt 5.8 引入该函数。


void QWaitCondition::notify_one()

  用于STL兼容。它相当于 wakeOne()。
  在 Qt 5.8 引入该函数。


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

  释放 lockedMutex 并等待条件。lockedMutex 最初必须由调用线程锁定。如果 lockedMutex 未处于锁定状态,则行为未定义。如果 lockedMutex 是递归互斥体,则此函数将立即返回。lockedMutex 将被解锁,调用线程将阻塞,直到满足以下任一条件:

  • 另一个线程调用 wakeOne() 或 wakeAll() 发出信号。在这种情况下,此函数将返回true。
  • 截止日期已到。如果 deadline 是默认值 QDeadlineTimer::Forever,则永远不会超时(必须用信号通知事件)。如果等待超时,此函数将返回false。

  lockedMutex 将返回到相同的锁定状态。提供此函数是为了允许原子从锁定状态转换到等待状态。   在 Qt 5.12 引入该函数。

另请参阅: wakeOne()、wakeAll()。


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

  重载。


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

  释放 lockedReadWriteLock 并等待条件。lockedReadWriteLock 最初必须由调用线程锁定。如果 lockedReadWriteLock 未处于锁定状态,则此函数将立即返回。 lockedReadWriteLock 不能递归锁定,否则此函数将无法正确释放锁。lockedReadWriteLock 将被解锁,调用线程将阻塞,直到满足以下任一条件:

  • 另一个线程调用 wakeOne() 或 wakeAll() 发出信号。在这种情况下,此函数将返回true。
  • 截止日期已到。如果 deadline 是默认值 QDeadlineTimer::Forever,则永远不会超时(必须用信号通知事件)。如果等待超时,此函数将返回false。

  lockedReadWriteLock 将返回到相同的锁定状态。提供此函数是为了允许原子从锁定状态转换到等待状态。
  在 Qt 5.12 引入该函数。

另请参阅: wakeOne()、wakeAll()。


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

  重载。


void QWaitCondition::wakeAll()

  唤醒等待条件的所有线程。线程的唤醒顺序取决于操作系统的调度策略,无法控制或预测。

另请参阅: wakeOne()。


void QWaitCondition::wakeOne()

  唤醒一个等待条件的线程。线程的唤醒顺序取决于操作系统的调度策略,无法控制或预测。
  如果要唤醒特定线程,解决方案通常是使用不同的等待条件,并让线程在不同的条件下等待。

另请参阅: wakeAll()。

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/cryfeifei-QtDocumentCN.git
git@api.gitlife.ru:oschina-mirror/cryfeifei-QtDocumentCN.git
oschina-mirror
cryfeifei-QtDocumentCN
cryfeifei-QtDocumentCN
master