定义:条件变量本身不是锁!但它也可以造成线程阻塞。通常与互斥锁配合使用。给多线程提供一个会合的场所。
主要应用函数:
-
pthread_cond_t 函数
用于定义条件变量
pthread_cond_t cond;
-
pthread_cond_init 函数
初始化一个条件变量
int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr); 参1:cond传入定义的条件变量的地址。 参2:attr 表条件变量属性,通常为默认值,传 NULL 即可 也可以使用静态初始化的方法,初始化条件变量: pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
-
pthread_cond_destroy 函数
销毁一个条件变量
int pthread_cond_destroy(pthread_cond_t *cond);
参1:cond传入定义的条件变量的地址。
阻塞等待一个条件变量
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
参1:cond传入定义的条件变量的地址。
参2:传入一定义的个互斥锁。
函数作用:
-
阻塞等待条件变量cond(参1)满足
-
释放已掌握的互斥锁(解锁互斥量)相当于pthread_mutex_unlock(&mutex);
注:1.2.两步为一个原子操作(绑定操作)。 -
当被唤醒,pthread_cond_wait 函数返回时,解除阻塞并重新申请获取互斥锁pthread_mutex_lock(&mutex);
限时等待一个条件变量
int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);
参1:cond传入定义的条件变量的地址。
参2:传入一定义的个互斥锁。
参3:参看man sem_timedwait 函数,查看struct timespec 结构体。
struct timespec {
time_t tv_sec; /* seconds */ 秒
longtv_nsec; /* nanosecondes*/ 纳秒
}形参 abstime:绝对时间。
唤醒至少一个阻塞在条件变量上的线程
int