多线程编程指南

相似的同步函数:条件变量

初始化条件变量

使用 cond_init(3C) 可以初始化 cv 所指向的条件变量。

cond_init 语法

#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 返回值

cond_init() 在成功运行后返回 0。如果检测到以下任一情况,cond_init() 将失败并返回对应的值。


EFAULT

描述:

cv 指向的地址非法。


EINVAL

描述:

type 不是可以识别的类型。

销毁条件变量

使用 cond_destroy(3C) 可以销毁与 cv 所指向的条件变量相关联的状态。用来存储该条件变量的空间不会释放。对于 POSIX 线程,请参见pthread_condattr_destroy 语法

cond_destroy 语法

#include <thread.h>



int cond_destroy(cond_t *cv);

cond_destroy 返回值

cond_destroy() 在成功运行后返回 0。如果检测到以下任一情况,cond_destroy() 将失败并返回对应的值。


EFAULT

描述:

cv 指向的地址非法。


EBUSY

描述:

系统检测到销毁活动条件变量的尝试。

等待条件

使用 cond_wait(3C) 可以原子方式释放 mp 所指向的互斥锁,并导致调用线程基于 cv 所指向的条件变量阻塞。阻塞的线程可以由 cond_signal()cond_broadcast() 唤醒,也可以在信号传送或 fork() 将其中断时唤醒。

cond_wait() 每次返回时,互斥锁均处于锁定状态并由调用线程拥有,即使返回错误时也是如此。

cond_wait 语法

#include <thread.h>



int cond_wait(cond_t *cv, mutex_t *mp);

cond_wait 返回值

cond_wait() 在成功运行后返回 0。如果检测到以下任一情况,cond_wait() 将失败并返回对应的值。


EFAULT

描述:

cv 指向的地址非法。


EBUSY

描述:

等待过程已被信号或 fork() 中断。

等待绝对时间

cond_timedwait(3C)cond_wait() 非常相似,区别在于 cond_timedwait() 经过 abstime 指定的时间之后不会阻塞。对于 POSIX 线程,请参见pthread_cond_timedwait 语法

cond_timedwait 语法

#include <thread.h>



int cond_timedwait(cond_t *cv, mutex_t *mp, timestruct_t abstime);

cond_timedwait() 每次返回时,互斥锁均会锁定并由调用线程拥有,即使返回错误时也是如此。

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() 函数一直阻塞,直到该条件获得信号,或者经过最后一个参数所指定的时间间隔为止。

cond_reltimedwait 语法

#include <thread.h>



int cond_reltimedwait(cond_t *cv, mutex_t *mp,

    timestruct_t reltime);

cond_reltimedwait 返回值

cond_reltimedwait() 在成功运行后返回 0。如果检测到以下任一情况,cond_reltimedwait() 将失败并返回对应的值。


EFAULT

描述:

cv 指向的地址非法。


ETIME

描述:

reltime 指定的时间已过期。

解除阻塞一个线程

对于基于 cv 所指向的条件变量阻塞的线程,使用 cond_signal(3C) 可以解除阻塞该线程。如果没有线程基于该条件变量阻塞,则调用 cond_signal() 不起任何作用。

cond_signal 语法

#include <thread.h>



int cond_signal(cond_t *cv);

cond_signal 返回值

cond_signal() 在成功运行后返回 0。如果检测到以下情况,cond_signal() 将失败并返回对应的值。


EFAULT

描述:

cv 指向的地址非法。

解除阻塞所有线程

对于基于 cv 所指向的条件变量阻塞的全部线程,使用 cond_broadcast(3C) 可以解除阻塞这些线程。如果没有线程基于该条件变量阻塞,则调用 cond_broadcast() 不起任何作用。

cond_broadcast 语法

#include <thread.h>



int cond_broadcast(cond_t *cv);

cond_broadcast 返回值

cond_broadcast() 在成功运行后返回 0。如果检测到以下情况,cond_broadcast() 将失败并返回对应的值。


EFAULT

描述:

cv 指向的地址非法。