13-测试条件变量的判断条件(predicate)
30.2.3 测试条件变量的判断条件(predicate)
每个条件变量都有与之相关的判断条件,涉及一个或多个共享变量。例如,在上一节的代码中,与cond相关的判断是(avail == 0)。这段代码展示了一个通用的设计原则:必须由一个while循环,而不是if语句,来控制对pthread_cond_wait()的调用。这是因为,当代码从pthread_cond_wait()返回时,并不能确定判断条件的状态,所以应该立即重新检查判断条件,在条件不满足的情况下继续休眠等待。
从pthread_cond_wait()返回时,之所以不能对判断条件的状态做任何假设,其理由如下。
- 其他线程可能会率先醒来。也许有多个线程在等待获取与条件变量相关的互斥量。即使就互斥量发出通知的线程将判断条件置为预期状态,其他线程依然有可能率先获取互斥量并改变相关共享变量的状态,进而改变判断条件的状态。
- 设计时设置“宽松的”判断条件或许更为简单。有时,用条件变量来表征可能性而非确定性,在设计应用程序时会更为简单。换言之,就条件变量发送信号意味着“可能有些事情”需要接收信号的线程去响应,而不是“一定有一些事情”要做。使用这种方法,可以基于判断条件的近似情况来发送条件变量通知,接收信号的线程可以通过再次检查判断条件来确定是否真的需要做些什么。
- 可能会发生虚假唤醒的情况。在一些实现中,即使没有任何其他线程真地就条件变量发出信号,等待此条件变量的线程仍有可能醒来。在一些多处理器系统上,为确保高效实现而采用的技术会导致此类(不常见的)虚假唤醒。SUSv3对此予以明确认可。