自学内容网 自学内容网

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)!