1、生产者消费者模型:假设有一筐饼,这时候生产者源源不断生产饼放进饼框中,此时有三个消费者(用三个线程代替),这时,三个人都想抢饼吃,这时候,当没有饼的时候他们就应该陷入阻塞等待状态,当有饼的时候,他们就会被告知饼来了,然后竞争获取新的饼,这时候,除了加锁之外,还需要一个重要的事情,就是需要被通知到饼来了这个情况,从而解除阻塞等待的状态,这个东西就叫做条件变量;
2、条件变量:可以实现阻塞,但并非锁,要和互斥量组合使用;
初始化一个条件变量:int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
可以定义一个变量通过函数赋值或者直接给一个条件变量进程初始化赋值;
销毁一个条件变量:int pthread_cond_destroy(pthread_cond_t *cond);
条件变量阻塞等待:1)int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
2)int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);
方法一是一直阻塞等待,方法二是超时等待,即超过给定的时间就不会进行等待了;
阻塞等待的方式是先将锁释放,这样所有线程就都会阻塞到条件变量上。
方法二时间的结构体:struct timespec{
time_t tv_sec; /*seconds 秒*/
long tv_nsec;
} /*纳秒*/ tv_sec是绝对时间,设置时需要time(NULL)+ time;
唤醒阻塞在条件变量cond上的线程:1)int pthread_cond_broadcast(pthread_cond_t *cond);
2)int pthread_cond_signal(pthread_cond_t *cond);
方法一是唤醒阻塞在条件变量cond上的全部线程,方法二是唤醒至少一个阻塞在条件变量cond上的线程;
原文:https://www.cnblogs.com/zz1314/p/12879878.html