(1)条件变量
条件变量本身不是锁,但它可以造成线程阻塞,通常与互斥锁配合使用。
(2)条件锁相关函数
pthread_cond_t类型,用于定义条件变量
1)初始化一个条件变量:pthread_cond_init
int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);
参数2:条件变量的属性,传NULL即可,为默认值
可采用静态初始化:pthread _cond_t cond=PTHREAD_COND_INITIALIZER;
2)销毁一个条件变量:pthread_cond_destroy
int pthread_cond_destroy(pthread_cond_t *cond);
3)阻塞等待条件变量:pthread_cond_wait(配合互斥锁使用)
int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);
函数作用:
1>阻塞等待条件变量cond满足。
2>释放已掌握的互斥锁(解锁互斥量)相当于pthread_mutex_unlock(&mutex);
第1,2步为一个原子操作
3>当被唤醒,pthread_cond_wait函数返回,解除阻塞并重新获得互斥锁pthread_mutex_lock(&mutex)
4)限时等待一个条件变量(以绝对时间等待):pthread_cond_timewait
int pthread_cond_timewait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex,condt struct timespec*restrcit abstime);
struct timespec{
time_t tv_sec;//秒
long tv_nsec;//纳秒
};
abstime;绝对时间,通过time(NULL)函数获取;
5)唤醒至少一个阻塞在条件变量上的线程:pthread_cond_signal
int pthread_cond_signal(pthread_cond_t *cond);
6)唤醒全部阻塞在条件变量上的线程:pthread_cond_broadcast(pthread_cond_t *cond);
(3)线程同步之生产者消费者变量模型
假定有两个线程,一个模拟生产者行为,一个模拟消费者行为。两个线程同时操作一个共享资源(汇聚),生产者生产产品,消费者消费产品。