Linux中条件变量的使用及注意事项
条件变量
- 应用场景:生产者消费者问题(类似于出租车和乘客问题)
- 必要性:为了实现等待某个资源,让线程休眠。提高运行效率
- 函数如下:
int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);
int pthread_cond_timewait(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(&mutex);
3.开始产生资源
pthread_cond_sigal(&cond); //通知一个消费线程
或者
pthread_cond_broadcast(&cond); //广播通知多个消费线程
pthread_mutex_unlock(&mutex);
4.消费者线程:
pthread_mutex_lock(&mutex);
while (如果没有资源){ //防止惊群效应
pthread_cond_wait(&cond, &mutex);
}
5.有资源了,消费资源
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循环。 - 代码如下:
注:这里有个疑问,就是while(Head==NULL)时候执行下面的语句,但此时出租车线程怎么获取到的上锁,原因就是pthread_cond_wait函数内部有上锁和解锁操作 - 执行如下:
原文地址:https://blog.csdn.net/weixin_58036810/article/details/135921377
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!