pthread_cond_wait 或 pthread_cond_timedwait 子例程

用途

在某一条件下阻塞调用线程。

线程库 (libpthreads.a)

语法

#include <pthread.h>

int pthread_cond_wait (cond, mutex)
pthread_cond_t *cond;
pthread_mutex_t *mutex;

int pthread_cond_timedwait (cond, mutex, timeout)
pthread_cond_t *cond;
pthread_mutex_t *mutex;
const struct timespec *timeout;

描述

pthread_cond_waitpthread_cond_timedwait 函数用于阻止条件变量。 它们在被调用线程锁定的 mutex 情况下被调用,否则将产生未定义的行为。

这些函数以原子方式释放 mutex ,并导致调用线程在条件变量 cond上阻塞; 以原子方式而言,此处表示另一个线程以原子方式访问互斥对象,然后访问条件变量。 即,如果另一个线程能够在关于到块的线程释放它之后获取互斥对象,那么对该线程中的 pthread_cond_signalpthread_cond_broadcast 的后续调用的行为就如同它是在关于到块的线程阻塞之后发出的一样。

成功返回后,互斥对象将被锁定并由调用线程拥有。

使用条件变量时,始终存在一个涉及共享变量的布尔谓词,该谓词与每个条件等待相关联,如果线程必须继续,那么该值为 true。 可能会发生来自 pthread_cond_waitpthread_cond_timedwait 函数的虚假唤醒。 由于从 pthread_cond_waitpthread_cond_timedwait 返回的结果并不意味着与此谓词的值相关的任何内容,因此必须在此类返回时对谓词进行重新求值。

未定义对同一条件变量的并发 pthread_cond_waitpthread_cond_timedwait 操作使用多个互斥对象的效果; 即,当线程等待条件变量时,条件变量将与唯一互斥对象绑定,并且此 (动态) 绑定在等待返回时结束。

条件等待 (无论是否计时) 是取消点。 当线程的可取消启用状态设置为 PTHREAD_CANCEL_DEFERRED 时,在条件等待时对取消请求执行操作的副作用是在调用第一个取消清除处理程序之前重新获取互斥对象 (有效)。 效果就像线程被取消阻塞一样,允许执行到从调用返回到 pthread_cond_waitpthread_cond_timedwait的时间点,但此时会注意到取消请求,而不是返回到 pthread_cond_waitpthread_cond_timedwait的调用者,从而启动线程取消活动,其中包括调用取消清除处理程序。

由于在对 pthread_cond_waitpthread_cond_timedwait 的调用中被阻塞而取消的线程不会使用任何条件信号,如果条件变量上有其他线程被阻塞,那么这些条件信号可能会同时定向到条件变量。

pthread_cond_timedwait 函数与 pthread_cond_wait 相同,但如果 timeout 指定的绝对时间在发出信号或广播条件 cond 之前经过 (即,系统时间等于或超过 timeout) ,或者如果在调用时已经过 timeout 指定的绝对时间,那么将返回错误。 发生此类超时时, pthread_cond_timedwait 将释放互斥对象并重新获取 互斥对象所引用的互斥对象。 函数 pthread_cond_timedwait 也是一个取消点。 timeout 指定的绝对时间可以基于系统实时时钟或系统单调时钟。 通过在使用相应的条件属性对象进行初始化之前调用 pthread_condattr_setclock 来设置条件变量的参考时钟。

如果将信号传递给线程,它们正在等待条件变量,那么当从信号处理程序返回时,线程将恢复等待条件变量,就像它未中断一样,或者它由于虚假唤醒而返回零。

参数

描述
cond 指定要等待的条件变量。
mutex 指定用于保护条件变量的互斥对象。 调用子例程时,必须锁定互斥对象。
超时 指向指定阻塞状态超时的绝对时间结构。

返回值

除 ETIMEDOUT 外,所有这些错误检查都像在函数处理开始时立即执行一样,在修改由互斥对象指定的互斥对象的状态或由 cond指定的条件变量之前,会导致生效的错误返回。

成功完成后,将返回值 0。 否则,将返回错误号以指示错误。

错误代码

如果发生以下情况, pthread_cond_timedwait 函数将失败:

描述
ETIMEDOUT timeoutpthread_cond_timedwait 指定的时间已过去。

如果返回以下错误代码,那么 pthread_cond_waitpthread_cond_timedwait 子例程将失败:

描述
EINVAL condmutextimeout 指定的值无效。
EINVAL 针对同一条件变量上的并发 pthread_cond_waitpthread_cond_timedwait 操作提供了不同的互斥对象。
EINVAL 在调用时,互斥对象不是当前线程所拥有的。
EPERM 在调用时,互斥对象未由当前线程拥有, XPG_SUS_ENV 设置为 ON ,并且未设置 XPG_UNIX98 。
ENOTRECOVERABLE 无法恢复互斥对象的受保护状态。
EOWNERDEAD 互斥对象是一个坚固的互斥对象,拥有互斥对象的线程的进程在持有互斥对象锁时终止。

这些子例程不会返回 EINTR 错误代码。