Home · All Classes · Modules · QSS HELP · QSS 案例 · VER007 HOME |
该QWaitCondition类提供了线程同步的条件变量。More...
该QWaitCondition类提供了线程同步的条件变量。
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用于控制访问环形缓冲器由一个生产者线程和消费者线程共享。
构造一个新的等待条件的对象。
释放锁定mutex并等待在等待条件。该mutex必须首先锁定调用线程。如果mutex是不是在锁定状态,该函数将立即返回。如果mutex是一个递归互斥体,该函数立即返回。该mutex将被解锁,并且调用线程将被阻塞,直到下列任一条件满足:
互斥将被返回到相同的锁定状态。这个功能被提供,以允许从锁定状态到等待状态的原子跃迁。
See also wakeOne()和wakeAll( ) 。
释放锁定readWriteLock并等待在等待条件。该readWriteLock必须首先锁定调用线程。如果readWriteLock是不是在锁定状态,该函数将立即返回。该readWriteLock不能被递归锁定,否则此功能将无法正常释放该锁。该readWriteLock将被解锁,并且调用线程将被阻塞,直到下列任一条件满足:
该readWriteLock将返回到相同的锁定状态。这个功能被提供,以允许从锁定状态到等待状态的原子跃迁。
此功能被引入Qt的4.4 。
See also wakeOne()和wakeAll( ) 。
唤醒等待等待条件的所有线程。在该线程被唤醒的顺序依赖于操作系统的调度策略,并不能被控制或预测。
See also wakeOne( ) 。
唤醒等待的一个线程等待条件。该被唤醒的线程依赖于操作系统的调度策略,并且不能被控制或预测。
如果你想唤醒一个特定的线程,该解决方案通常使用不同的等待状态,并有不同的线程在等待不同的条件。
See also wakeAll( ) 。
PyQt 4.10.3 for X11 | Copyright © Riverbank Computing Ltd and Nokia 2012 | Qt 4.8.5 |