前言
条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待”条件变量的条件成立”而挂起;另一个线程使”条件成立”(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。
1、函数说明
a、pthread_cond_init函数可以用来初始化一个条件变量。他使用变量attr所指定的属性来初始化一个条件变量,如果参数attr为空,那么它将使用缺省的属性来设置所指定的条件变量。
b、pthread_cond_destroy函数可以用来摧毁所指定的条件变量,同时将会释放所给它分配的资源。调用该函数的进程也并不要求等待在参数所指定的条件变量上。
c、pthread_cond_timedwait函数与thread_cond_wait函数都用来等待条件的满足,区别在于,pthread_cond_timedwait函数如果达到或是超过所引用的参数abstime,它将结束并返回错误ETIME。pthread_cond_wait 执行的流程首先将这个mutex解锁, 然后等待条件变量被唤醒, 如果没有被唤醒, 该线程将一直休眠, 也就是说, 该线程将一直阻塞在这个pthread_cond_wait调用中, 而当此线程被唤醒时, 首先判断条件变量是否为真,如果否继续进入睡眠等待下一次激活,如果为真那么将这个mutex加锁,然后退出。也就是说pthread_cond_wait实际上可以看作是以下几个动作的合体:(1)解锁线程锁;(2)等待线程唤醒,并且条件为true;(3)加锁线程锁
pthread_cond_timedwait函数的参数abstime指向一个timespec结构。该结构如下:
typedef struct timespec {
time_t tv_sec;
long tv_nsex;
}timespec_t;
d、当调用pthread_cond_signal时,一个在相同条件变量上阻塞的线程将被解锁。如果同时有多个线程阻塞,则由调度策略确定接收通知的线程。如果调用pthread_cond_broadcast,则将通知阻塞在这个条件变量上的所有线程。一旦被唤醒,线程仍然会要求互斥锁。如果当前没有线程等待通知,则两种调用实际上成为一个空操作。如果参数*cond指向非法地址,则返回值EINVAL。pthread_cond_signal仅仅负责唤醒正在阻塞在同一条件变量上的一个线程,如果存在多个线程,系统自动根据调度策略决定唤醒其中的一个线程,在多处理器上,该函数是可能同时唤醒多个线程,同时该函数与锁操作无关,解锁是由pthread_mutex_unlock(&mutex)完成的。