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_TIMEOUTPR_Wait 在指定的时间间隔到期后恢复执行。如果使用超时值,则布尔表达式必须包含经过的时间作为监视数据的一部分。

从等待中恢复仅仅是一个评估表达式的机会,而不是断言表达式为真。