一、条件变量
应用场景:生产者消费者问题,是线程同步的一种手段。
必要性:为了实现等待某个资源,让线程休眠。提高运行效率
int pthread_cond_wait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex);
int pthread_cond_timedwait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex,
const struct timespec *restrict abstime);
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
二、使用步骤
1.初始化:
静态初始化
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; //初始化条件变量
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; //初始化互斥量
或使用动态初始化
pthread_cond_init(&cond);
2.生产资源线程:
pthread_mutex_lock
(&m
u
t
e
x);
开始产生资源
pthread_cond_sigal(&cond); //
通知一个消费线程
或者
pthread_cond_broadcast(&cond); //
广播通知多个消费线程
pthread_mutex_unlock(&mutex);
3.消费者线程:
pthread_mutex_lock(&mutex);
while
(如果没有资源)
{ //
防止惊群效应
pthread_cond_wait(&cond, &mutex);
}
有资源了,消费资源
pthread_mutex_unlock(&mutex);
注意:
1 pthread_cond_wait(&cond, &mutex)
,在没有资源等待是是先
unlock
休眠,等资源到了,再
lock
所以
pthread_cond_wait he pthread_mutex_lock
必须配对使用。
2
如果
pthread_cond_signal
或者
pthread_cond_broadcast
早于
pthread_cond_wait
,则有可能会丢失信号。
3 pthead_cond_broadcast
信号会被多个线程收到,这叫线程的惊群效应。所以需要加上判断条件
while
循环。