pthread_cond_wait()是linux多线程同步实现的一种方法,表示等待某一个线程共享变量满足了某种情况时
线程才能继续执行 pthread_cond_wait()之后的代码,如下面的示例代码段所示,thread_func()函数中的代码
示例是一种比较常见的等待共享变量的方式,这里主要关注 while(head == NULL)的使用
 
struct xxx* head; /** 全局线程共享变量*/
pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; /** 为条件变量搭配的互斥锁*/
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; /** 定义全局线程共享的条件变量*/ staticvoid* thread_func(void*arg)
{
/** 首先先获得互斥锁,表示同一时间只能有一个线程等待条件变量
* 如果没有保持只有一个线程监听条件变量的话,那有可能会引起线程的"惊群"现象
*/
pthread_mutex_lock(&mtx); /** 下面理解为什么需要先判断 head == NULL 的值(假设这里就是需要等待 head == NULL )
* 根据pthread相关文档理解: 假设线程1执行到pthread_cond_wait()时,首先线程释放mtx互斥锁,
* 之后再开始等待pthread_cond_signal()或者pthread_cond_broadcast()发送过来的"条件满足信号"
* 假如这时候某另外的一个线程2获得了mtx锁并改变head的值,使得head == NULL 并发送了信号且
* 完成之后释放了mtx锁, 这时候可能系统存在线程3正在等待获得互斥锁,那么现在有两种情况:1.线程3
* 获得锁,之后对head进行了一些操作,之后可能发送了信号,再释放了互斥锁;2.线程1获得了互斥
* 锁mtx,那么这时候线程1继续原来等待的逻辑,由于等待时释放了锁,现在需要重新获得这种情况也获得了,
* 这时候程序执行while(head == NULL)的判断,ok, 现在能明白为什么这里需要判断 head == NULL ?了,因为在
* 上面情况1中线程3比线程1可能更早一步获得锁之后对head操作并使得head != NULL ,事实上大型的系统可能会有更多
* 的线程同时在竞争一个互斥锁,对于共享变量值的改变可能会有更多的情况,也就是说线程1进入等待之后释放锁,
* 直到收到唤醒信号, 在去重新获得锁的过程中,不一定能在收到信号后作为第一个获得锁的线程,也就是在获得锁时
* 其他线程可能获得锁并改变了head的值,比如上面例子尽管线程2在head == NULL 时发出了信号。
* 线程1判断head == NULL是否满足,如果不满足条件,则重新释放mtx锁,并进入信号等待的过程,重复上面唤醒的逻辑
* 直到 head == NULL 时,程序执行之后的逻辑,最后释放mtx互斥锁
*/
while(head != NULL)
{
pthread_cond_wait(&cond, &mtx);
} /** head == NULL 时执行的逻辑*/
... pthread_mutex_unlock(&mtx);//临界区数据操作完毕,释放互斥锁 return0;
}
 以上所说的信号,并不是只unix/linux 信号量或者系统信号的概念,仅仅代表一种线程唤醒的通信方式

关于pthread_cond_wait()使用的理解的更多相关文章

  1. pthread_cond_wait()函数的理解(摘录)

    /************pthread_cond_wait()的使用方法**********/pthread_mutex_lock(&qlock);    /*lock*/pthread_c ...

  2. 深入理解pthread_cond_wait、pthread_cond_signal

    ===============================man pthread_cond_wait的解释========================== LINUX环境下多线程编程肯定会遇到 ...

  3. linuxc线程信号-pthread_cond_wait理解

    pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t*mutex)函数 传入的參数mutex用于保护条件,由于我们在调用pthread_con ...

  4. 关于pthread_cond_wait使用while循环判断的理解

    在Stevens的<Unix 环境高级编程>中第11章线程关于pthread_cond_wait的介绍中有一个生产者-消费者的例子P311,在进入pthread_cond_wait前使用w ...

  5. pthread_cond_wait的原子性

    使用的基本模板如下(参考APUE): signal代码序列如下, pthread_mutex_lock ... pthread_cond_signal pthread_mutex_unlock   w ...

  6. 深入理解 iOS 开发中的锁

    来源:伯乐在线 - 夏天然后 链接:http://ios.jobbole.com/89474/ 点击 → 申请加入伯乐在线专栏作者 摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大 ...

  7. 理解 Linux 条件变量

    理解 Linux 条件变量 1 简介 当多个线程之间因为存在某种依赖关系,导致只有当某个条件存在时,才可以执行某个线程,此时条件变量(pthread_cond_t)可以派上用场.比如: 例1: 当系统 ...

  8. 互斥量、条件变量与pthread_cond_wait()函数的使用,详解(一)

    1. 首先pthread_cond_wait 的定义是这样的 The pthread_cond_wait() and pthread_cond_timedwait() functions are us ...

  9. pthread_cond_wait()函数的详解

    http://hi.baidu.com/tjuer/item/253cc6d66b921317d90e4483 了解 pthread_cond_wait() 的作用非常重要 -- 它是 POSIX 线 ...

随机推荐

  1. DIV内容垂直居中

    css垂直居中属性设置vertical-align: middle对div不起作用,例如: <!DOCTYPE html> <html lang="zh-CN"& ...

  2. Echarts 的 Java 封装类库 转自 https://my.oschina.net/flags/blog/316920

    转自: https://my.oschina.net/flags/blog/316920 Echarts 的 Java 封装类库:http://www.oschina.net/p/echarts-ja ...

  3. Linux基础命令---rmdir

    rmdir 删除一个空目录,可以同时删除途经的父目录,但是要确保父目录中没有其他内容. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. ...

  4. 为什么学Python语言,只需四步全面了解Python语言

    为什么学Python语言,只需四步全面了解Python语言每个时代都会悄悄犒赏会选择的人,Python现在风口的语言Python--第三大主流编程语言Python , 是一种面向对象的解释型计算机程序 ...

  5. php 获取随机数的几个方式

    php 获取随机数的几个方式 1.直接获取从min-max的数,例如1-20:$randnum = mt_rand(1, 20); 2.在一个数组里面随机选择一个(验证码的时候需要字母.数字混合的情况 ...

  6. 通过Jenkins + Docker实现antdPro自动化推送私服、自动容器化部署功能

    Docker与Docker私服 1. 安装docker https://docs.docker.com/install/ 2. 配置docker镜像加速 https://www.daocloud.io ...

  7. 20165310 Java实验四 《Android程序设计》

    20165310 实验四 <Android程序设计> 第24章:初识Android 任务一:改写res目录中的内容,Hello World后要显示自己的学号,自己学号前后一名同学的学号 首 ...

  8. Python3基础 tuple 通过拆分元素 把元组的数据删除

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  9. HDU3085(双向BFS+曼哈顿距离)题解

    Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  10. 关于ActiveMQ、RocketMQ、RabbitMQ、Kafka一些总结和区别

    这是一篇分享文 转自:http://www.cnblogs.com/williamjie/p/9481780.html  尊重原作,谢谢 消息队列 为什么写这篇文章? 博主有两位朋友分别是小A和小B: ...