class QWaitCondition#

QWaitCondition 类提供了用于线程同步的条件变量。更多信息...

摘要#

方法#

注意

本文档可能包含自动从C++翻译到Python的片段。我们始终欢迎对片段翻译的贡献。如果您发现翻译存在问题,您也可以通过在https:/bugreports.qt.io/projects/PYSIDE上创建票据来告知我们。

详细说明#

警告

本节包含自动从C++翻译到Python的片段,可能包含错误。

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 = count + 1
    mutex.unlock()
    do_something()
    mutex.lock()
    count = count - 1
    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()

互斥锁是必要的,因为两个线程同时尝试更改同一变量的结果是不可预测的。

等待条件是线程同步的一个强大原语。《使用等待条件的生产者和消费者》示例展示了如何使用 QWaitCondition 作为 QSemaphore 的替代品来控制对生产者线程和消费者线程共享的循环缓冲区的访问。

__init__()#

构造一个新的等待条件对象。

notify_all()#

此函数提供以与STL兼容。它相当于 wakeAll() .

notify_one()#

此函数提供以与STL兼容。它相当于 wakeOne() .

wait(lockedMutex[, deadline=QDeadlineTimer(QDeadlineTimer.Forever)])#
参数:
返回类型:

bool

释放 lockedMutex 并在等待条件下等待。调用线程必须最初锁定 lockedMutex 。如果 lockedMutex 未锁定,其行为是未定义的。如果 lockedMutex 是递归互斥锁,此函数将立即返回。将解锁 lockedMutex ,并且调用线程将阻塞,直到满足以下条件之一

  • 另一个线程通过使用 wakeOne()wakeAll() 来发出信号。在这种情况下,此函数将返回 true。

  • 给定 deadline 的截止时间到达。如果 deadlineQDeadlineTimer::Forever(默认值),则等待永远不会超时(事件必须发出信号)。如果等待超时,此函数将返回 false。

lockedMutex 返回到相同的状态。此函数提供了一种原子地将锁定状态转换为等待状态的过渡。

也可参见

wakeOne() wakeAll()

wait(lockedMutex, time)
参数:
  • lockedMutexQMutex

  • time – int

返回类型:

bool

这是一个重载的函数。

释放 lockedMutex 并等待 time 毫秒的等待条件。

wait(lockedReadWriteLock[, deadline=QDeadlineTimer(QDeadlineTimer.Forever)])
参数:
返回类型:

bool

释放 lockedReadWriteLock 并等待等待条件。必须由调用线程初始锁定 lockedReadWriteLock。如果 lockedReadWriteLock 不是一个锁定状态,此函数将立即返回。不能递归锁定 lockedReadWriteLock,否则此函数将无法正确释放锁。在满足以下任一条件之前,将解锁 lockedReadWriteLock 并让调用线程阻塞

  • 另一个线程通过使用 wakeOne()wakeAll() 来发出信号。在这种情况下,此函数将返回 true。

  • 给定 deadline 的截止时间到达。如果 deadlineQDeadlineTimer::Forever(默认值),则等待永远不会超时(事件必须发出信号)。如果等待超时,此函数将返回 false。

lockedReadWriteLock 返回到相同的锁定状态。此函数提供了一种允许原子地从锁定状态转换到等待状态的过渡。

也可参见

wakeOne() wakeAll()

wait(lockedReadWriteLock, time)
参数:
返回类型:

bool

这是一个重载的函数。

释放 lockedReadWriteLock 并等待 time 毫秒的等待条件。

wakeAll()#

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

也可参见

wakeOne()

wakeOne()#

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

如果您想要唤醒特定线程,通常的解决方法是使用不同的等待条件,并让不同的线程在不同的条件下等待。

也可参见

wakeAll()