除了互斥体类型 PRLock 之外,NSPR 还提供了一种特殊类型 PRMonitor,用于 Java 编程。本章介绍用于创建和操作类型为 PRMonitor 的互斥体的 NSPR API。
对于类型为 PRLock 的互斥体,单个线程只能在退出之前进入监视器一次,并且互斥体可以有多个关联的条件变量。
对于类型为 PRMonitor 的互斥体,单个线程可以根据需要多次重新进入监视器。线程第一次进入监视器时,它会获取监视器的锁,并且线程的进入计数会递增到 1。线程每次随后成功进入同一个监视器时,线程的进入计数都会再次递增,并且每次线程退出监视器时,线程的进入计数都会递减。当线程的进入计数达到零时,线程会释放监视器的锁,并且之前在尝试进入监视器时被阻塞的其他线程将被重新调度。
调用 PR_Wait 会暂时将进入计数返回到零。当调用线程恢复时,它具有与等待操作之前相同的进入计数。
与类型为 PRLock 的互斥体不同,类型为 PRMonitor 的互斥体只有一个隐式关联的条件变量,可用于促进线程与监视数据状态变化的同步。
有关 NSPR 线程同步(包括锁和条件变量)的介绍,请参见 NSPR 简介。
监视器类型¶
除了 PR_NewMonitor(它创建一个新的监视器对象)之外,所有监视器函数都需要指向类型为 PRMonitor 的不透明对象的指针。
监视器函数¶
所有监视器函数都是线程安全的。但是,此安全性不扩展到保护监视器对象免于删除。
PR_NewMonitor 创建一个新的监视器。
PR_DestroyMonitor 销毁监视器对象。
PR_EnterMonitor 进入与指定监视器关联的锁。
PR_ExitMonitor 递减与指定监视器关联的进入计数。
PR_Wait 等待指定监视器的条件变量上的通知。
PR_Notify 通知正在等待指定监视器的条件变量上的线程。
PR_NotifyAll 通知所有正在等待指定监视器的条件变量上的线程。