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循环。
  • 代码如下:
    Linux中条件变量的使用及注意事项_第1张图片
    Linux中条件变量的使用及注意事项_第2张图片
    注:这里有个疑问,就是while(Head==NULL)时候执行下面的语句,但此时出租车线程怎么获取到的上锁,原因就是pthread_cond_wait函数内部有上锁和解锁操作
  • 执行如下:
    Linux中条件变量的使用及注意事项_第3张图片

条件变量注意事项

  • 当多个乘客去坐车时代码如下:
    Linux中条件变量的使用及注意事项_第4张图片
  • 执行如下:
    Linux中条件变量的使用及注意事项_第5张图片
  • pthread_cond_broadcast(&hasTaxi)函数使用
    Linux中条件变量的使用及注意事项_第6张图片
    Linux中条件变量的使用及注意事项_第7张图片
  • 执行如下:
    Linux中条件变量的使用及注意事项_第8张图片
    注:发现报错了,提示段错误
  • 来调试找错误
    Linux中条件变量的使用及注意事项_第9张图片
    注:可以发现出错点在57行,因为同时发给乘客信号,而导致资源不够用,因此将上述的while注释给打开

你可能感兴趣的:(开发语言,linux,运维,服务器)