- class QWaitCondition#
QWaitCondition
类提供了用于线程同步的条件变量。更多信息...摘要#
方法#
def
__init__()
def
notify_all()
def
notify_one()
def
wait()
def
wakeAll()
def
wakeOne()
注意
本文档可能包含自动从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)])#
- 参数:
lockedMutex –
QMutex
deadline –
QDeadlineTimer
- 返回类型:
bool
释放
lockedMutex
并在等待条件下等待。调用线程必须最初锁定lockedMutex
。如果lockedMutex
未锁定,其行为是未定义的。如果lockedMutex
是递归互斥锁,此函数将立即返回。将解锁lockedMutex
,并且调用线程将阻塞,直到满足以下条件之一将
lockedMutex
返回到相同的状态。此函数提供了一种原子地将锁定状态转换为等待状态的过渡。- wait(lockedMutex, time)
- 参数:
lockedMutex –
QMutex
time – int
- 返回类型:
bool
这是一个重载的函数。
释放
lockedMutex
并等待time
毫秒的等待条件。- wait(lockedReadWriteLock[, deadline=QDeadlineTimer(QDeadlineTimer.Forever)])
- 参数:
lockedReadWriteLock –
QReadWriteLock
deadline –
QDeadlineTimer
- 返回类型:
bool
释放
lockedReadWriteLock
并等待等待条件。必须由调用线程初始锁定lockedReadWriteLock
。如果lockedReadWriteLock
不是一个锁定状态,此函数将立即返回。不能递归锁定lockedReadWriteLock
,否则此函数将无法正确释放锁。在满足以下任一条件之前,将解锁lockedReadWriteLock
并让调用线程阻塞将
lockedReadWriteLock
返回到相同的锁定状态。此函数提供了一种允许原子地从锁定状态转换到等待状态的过渡。- wait(lockedReadWriteLock, time)
- 参数:
lockedReadWriteLock –
QReadWriteLock
time – int
- 返回类型:
bool
这是一个重载的函数。
释放
lockedReadWriteLock
并等待time
毫秒的等待条件。- wakeAll()#
唤醒所有等待等待条件的线程。被唤醒的线程顺序取决于操作系统的调度策略,无法控制或预测。
也可参见
- wakeOne()#
唤醒一个等待等待条件的线程。唤醒的线程取决于操作系统的调度策略,无法控制或预测。
如果您想要唤醒特定线程,通常的解决方法是使用不同的等待条件,并让不同的线程在不同的条件下等待。
也可参见