PR_Wait¶
等待监视数据达到应用程序定义的状态。
语法¶
#include <prmon.h>
PRStatus PR_Wait(
PRMonitor *mon,
PRIntervalTime ticks);
参数¶
该函数具有以下参数
mon
对类型为 PRMonitor 的现有结构的引用。引用的监视器对象必须是调用线程当前持有锁的对象。
ticks
线程愿意等待显式通知的时间量(以 PRIntervalTime 单位为单位),在重新调度之前。
返回值¶
该函数返回以下值之一
PR_SUCCESS` 表示线程正在从
PR_Wait` 调用中恢复, 要么是因为它被显式通知, 要么是因为参数 ``ticks
指定的时间已过期。PR_FAILURE 表示
PR_Wait
遇到系统错误(例如无效的监视器引用)或线程被另一个线程中断。
描述¶
调用 PR_Wait 会导致线程释放监视器的锁,就像它已经调用了 PR_ExitMonitor 与调用 PR_EnterMonitor 的次数一样多。这使得监视器可供其他线程使用。等待结束后,线程会重新获得对监视器锁的控制,其入口计数与等待开始前相同。
当监视器被通知或 ticks
参数指定的时间到期时,等待中的线程将恢复。从等待中恢复仅仅是一个提示,表明状态发生了变化。程序员有责任评估数据并采取相应措施。这通常通过评估涉及监视数据的布尔表达式来完成。当布尔表达式为假时,线程应该等待。只有当表达式为真时,线程才应该对数据采取行动。布尔表达式必须在监视器内和循环内进行评估。
在伪代码中,顺序如下
PR_EnterMonitor(&ml);
while (!expression) wait;
... act on the state change ...
PR_ExitMonitor(&ml);
线程可能由于多种原因从等待中恢复。最明显的原因是它被另一个线程通知。如果 timeout 的值不是 PR_INTERVAL_NO_TIMEOUT
,PR_Wait 在指定的时间间隔到期后恢复执行。如果使用超时值,则布尔表达式必须包含经过的时间作为监视数据的一部分。
从等待中恢复仅仅是一个评估表达式的机会,而不是断言表达式为真。