在现实的软件开发过程中,经常会碰到如下情景:某个模块负责产生数据,这些数据由另外一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程和进程等)。产生数据的模块称之为生产者,而处理数据的模块就是消费者。
条件变量
在正式开始生产者与消费者模型之前,我们应该对条件变量有一个新的认识。
条件变量(Condition Variable):它的作用是描述资源的就绪状态,属于线程的一种同步机制。互斥锁用于上锁,条件变量用于等待。条件变量本身是由互斥量保护的,线程在改变之前首先会封锁互斥量,因此其他线程在获得互斥量之前不会觉察到这样的变化。
(1)pthread_cond_init 和 pthread_cond_destroy:条件变量的初始化与销毁。
#include <pthread.h>
int pthread_cond_destroy(pthread_cond_t *cond);//条件变量销毁
int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);//条件变量初始化
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
参数cond:条件变量。
参数attr:条件变量的属性,设置为NULL则表示缺省属性。
返回值:成功返回0,失败返回错误码。
和mutex的初始化和销毁类似,如果条件变量是静态分配的,也可以使用PTHREAD_COND_INITALIZER初始化,相当于用pthread_cond_init函数初始化并设置参数attr为NULL。
(2)pthread_cond_wait/timewait:前者是条件变量等待,后者是等待超时。
#include <pthread.h>
int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);
int p