初始化条件变量
销毁条件变量
等待条件
等待绝对时间
等待时间间隔
解除阻塞一个线程
解除阻塞所有线程
使用 cond_init(3C) 可以初始化 cv 所指向的条件变量。
#include <thread.h> int cond_init(cond_t *cv, int type, int arg);
type 可以是以下值之一:
条件变量还可以通过在清零的内存中进行分配来初始化,在这种情况下假设 type 为 USYNC_THREAD。
多个线程决不能同时初始化同一个条件变量。对于其他线程可能正在使用的条件变量,不得重新初始化。
对于 POSIX 线程,请参见pthread_condattr_init 语法。
#include <thread.h> cond_t cv; int ret; /* to be used within this process only */ ret = cond_init(cv, USYNC_THREAD, 0);
#include <thread.h> cond_t cv; int ret; /* to be used among all processes */ ret = cond_init(&cv, USYNC_PROCESS, 0);
cond_init() 在成功运行后返回 0。如果检测到以下任一情况,cond_init() 将失败并返回对应的值。
EFAULT
描述:cv 指向的地址非法。
EINVAL
描述:type 不是可以识别的类型。
使用 cond_destroy(3C) 可以销毁与 cv 所指向的条件变量相关联的状态。用来存储该条件变量的空间不会释放。对于 POSIX 线程,请参见pthread_condattr_destroy 语法。
#include <thread.h> int cond_destroy(cond_t *cv);
cond_destroy() 在成功运行后返回 0。如果检测到以下任一情况,cond_destroy() 将失败并返回对应的值。
EFAULT
描述:cv 指向的地址非法。
EBUSY
描述:系统检测到销毁活动条件变量的尝试。
使用 cond_wait(3C) 可以原子方式释放 mp 所指向的互斥锁,并导致调用线程基于 cv 所指向的条件变量阻塞。阻塞的线程可以由 cond_signal() 或 cond_broadcast() 唤醒,也可以在信号传送或 fork() 将其中断时唤醒。
cond_wait() 每次返回时,互斥锁均处于锁定状态并由调用线程拥有,即使返回错误时也是如此。
#include <thread.h> int cond_wait(cond_t *cv, mutex_t *mp);
cond_wait() 在成功运行后返回 0。如果检测到以下任一情况,cond_wait() 将失败并返回对应的值。
EFAULT
描述:cv 指向的地址非法。
EBUSY
描述:等待过程已被信号或 fork() 中断。
cond_timedwait(3C) 与 cond_wait() 非常相似,区别在于 cond_timedwait() 经过 abstime 指定的时间之后不会阻塞。对于 POSIX 线程,请参见pthread_cond_timedwait 语法。
#include <thread.h> int cond_timedwait(cond_t *cv, mutex_t *mp, timestruct_t abstime);
cond_timedwait() 每次返回时,互斥锁均会锁定并由调用线程拥有,即使返回错误时也是如此。
cond_timedwait() 函数会一直阻塞,直到该条件获得信号,或者经过最后一个参数所指定的时间为止。超时以具体的时间指定,这样即可在不重新计算超时值的情况下高效地重新测试条件。
cond_timedwait() 在成功运行后返回 0。如果检测到以下任一情况,cond_timedwait() 将失败并返回对应的值。
EFAULT
描述:cv 指向的地址非法。
ETIME
描述:由 abstime 指定的时间已过期。
EINVAL
描述:abstime 无效。
cond_reltimedwait(3C) 与 cond_timedwait() 非常相似,区别在于第三个参数的值不同。cond_reltimedwait() 的第三个参数采用相对时间间隔值,而不是绝对时间值。对于 POSIX 线程,请参见 pthread_cond_reltimedwait_np(3C) 手册页。
cond_reltimedwait() 每次返回时,互斥锁均会锁定并由调用线程拥有,即使返回错误时也是如此。cond_reltimedwait() 函数一直阻塞,直到该条件获得信号,或者经过最后一个参数所指定的时间间隔为止。
#include <thread.h> int cond_reltimedwait(cond_t *cv, mutex_t *mp, timestruct_t reltime);
cond_reltimedwait() 在成功运行后返回 0。如果检测到以下任一情况,cond_reltimedwait() 将失败并返回对应的值。
EFAULT
描述:cv 指向的地址非法。
ETIME
描述:由 reltime 指定的时间已过期。
对于基于 cv 所指向的条件变量阻塞的线程,使用 cond_signal(3C) 可以解除阻塞该线程。如果没有线程基于该条件变量阻塞,则调用 cond_signal() 不起任何作用。
#include <thread.h> int cond_signal(cond_t *cv);
cond_signal() 在成功运行后返回 0。如果检测到以下情况,cond_signal() 将失败并返回对应的值。
EFAULT
描述:cv 指向的地址非法。
对于基于 cv 所指向的条件变量阻塞的全部线程,使用 cond_broadcast(3C) 可以解除阻塞这些线程。如果没有线程基于该条件变量阻塞,则调用 cond_broadcast() 不起任何作用。
#include <thread.h> int cond_broadcast(cond_t *cv);
cond_broadcast() 在成功运行后返回 0。如果检测到以下情况,cond_broadcast() 将失败并返回对应的值。
EFAULT
描述:cv 指向的地址非法。