再次看到Condition,第一感觉还是觉得它和Mutex的功能是一样的,没必要存在。心里这么想,其实自己也知道怎么可能多余呢?老老实实的再分析一下代码,这次一定要把理解出来的内容记下来!都怪平时写代码太少,用到Condition的情况更少,偶尔想用的时候又忘记怎么用,于是就算了。

拿一段Condition的使用代码,反复的揣摩对比。

void
process_msg(void)
{
struct msg *mp;
for (;;) {
  pthread_mutex_lock(&qlock);
  while (workq == NULL)
    pthread_cond_wait(&qready, &qlock);
  mp = workq;
  workq = mp->m_next;
  pthread_mutex_unlock(&qlock);
/* now process the message mp */
  }
}

  经过反复的揣摩,我觉得Condition就像我们在调试代码的时候设置的某种断点,它设计的意义在于两个或者多个线程之间相互协调,相互配合,每个线程都要扮演一个角色,或者是生产者,或者是消费者,不管是哪一种,至少是一种。mutex虽然也是用于多线程间,但它设计的重点是保护自己的操作不被其它线程影响。如果想用它来实现生产者角色与消费者角色的区别,我只能说太难了,就算你想成为生产者,消费者也不一定给你机会,你得先抢到锁才行,消费者明明没有东西消费还要与生产者抢锁,这样子效率极其底下。

  而在Condition介入下情况比较好了,消费者发现没有东西消费,迅速让出锁,并在Condition上阻塞,生产者可以迅速的获取锁(与消费者抢锁的概率要底出很多,因为阻塞在Condition上的消费者线程不会再去抢锁,除非它再次被叫醒)。

  另外一个问题,Condition为什么需要Mutex呢?Condition从pthread_cond_wait返回只能说明条件有变化,至于哪些有变化,有什么变化,是否适合自己,Condition无法描述,也不需要它描述,因为我们无法把所有情况全部列举出来。我们只能在具体的代码中自己检测。这个检测的过程需要是一个原子操作,mutex的作用就是要保证条件检测和部分必须操作的原子性。

     pthread_cond_wait还有一点需要注意,它执行进去之后先检查条件是否满足,如果满足继续向下执行,否则释放mutex,阻塞在condition上,等被叫醒的时候去抢mutex,抢到进入保护代码,执行完释放mutex。

工具类之Condition的更多相关文章

  1. MongoDBDao 工具类(包含分页取数据)

    mongdb工具类 package e16wifi.statistic.com.mongodb; import java.util.ArrayList; import java.util.List; ...

  2. AQS 框架之 LockSupport 线程阻塞工具类

    ■ 前言 并发包一直是 JDK 里面比较难理解的,同时也是很精美的语言,膜拜下 Doug Li 大神.作者不敢长篇大论,只求循序渐进地把并发包通过理论和实战 (代码) 的方式介绍给大家. 其实做每一件 ...

  3. 多线程学习笔记六之并发工具类CountDownLatch和CyclicBarrier

    目录 简介 CountDownLatch 示例 实现分析 CountDownLatch与Thread.join() CyclicBarrier 实现分析 CountDownLatch和CyclicBa ...

  4. 并发编程(二)concurrent 工具类

    并发编程(二)concurrent 工具类 一.CountDownLatch 经常用于监听某些初始化操作,等初始化执行完毕后,通知主线程继续工作. import java.util.concurren ...

  5. Java并发(十三):并发工具类——同步屏障CyclicBarrier

    先做总结 1.CyclicBarrier 是什么? CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫同步点) ...

  6. Java并发多线程 - 并发工具类JUC

    安全共享对象策略 1.线程限制 : 一个被线程限制的对象,由线程独占,并且只能被占有它的线程修改 2.共享只读 : 一个共享只读的对象,在没有额外同步的情况下,可以被多个线程并发访问, 但是任何线程都 ...

  7. java多线程无锁和工具类

    1 无锁 (1) cas (compare and swap) 设置值的时候,会比较当前值和当时拿到的值是否相同,如果相同则设值,不同则拿新值重复过程:注意,在设置值的时候,取值+比较+设值 是一条c ...

  8. 深入分析同步工具类之AbstractQueuedSynchronizer

      概览: AQS(简称)依赖内部维护的一个FIFO(先进先出)队列,可以很好的实现阻塞.同步:volatile修饰的属性state,哪个线程先改变这个状态值,那么这个线程就获得了优先权,可以做任何事 ...

  9. java高并发系列 - 第15天:JUC中的Semaphore,最简单的限流工具类,必备技能

    这是java高并发系列第15篇文章 Semaphore(信号量)为多线程协作提供了更为强大的控制方法,前面的文章中我们学了synchronized和重入锁ReentrantLock,这2种锁一次都只能 ...

随机推荐

  1. 设计模式之单例模式(php实现)

    github地址:https://github.com/ZQCard/design_pattern 单例模式:顾名思义就就是创建单个实例的模式. 优点:保证一个类仅有一个实例,并提供一个访问它的全局访 ...

  2. Visio文件转EPS文件

    Visio转eps by gaihf@水木 看了前人写的关于Visio转EPS的文章,但是实践过程中还是碰到几个棘手的问题.现在这些问题终于解决了,把自己的一点体会分享给大家. 很多人习惯用Visio ...

  3. Java:网络编程之应用实例

    1.聊天 编写一个聊天程序,有收数据的部分和发数据的部分. 这两部分需要同时执行,那么就需要多线程技术. 一个线程控制发送. 一个线程控制接收. 因为收和发动作是不一致的,所以要定义两个run方法,而 ...

  4. linux系统清理僵尸进程记录

    在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程.  在fork()/execve()过程中,假设子进程结束时父进程仍存在, ...

  5. 通过java api提交自定义hadoop 作业

    通过API操作之前要先了解几个基本知识 一.hadoop的基本数据类型和java的基本数据类型是不一样的,但是都存在对应的关系 如下图 如果需要定义自己的数据类型,则必须实现Writable hado ...

  6. .Net程序测试使用阿里云OCS开放缓存服务

     首先需要有一个阿里的OCS实例和ECS云服务器 请确认这两个是在同一个可用区的,这个很重要! 这两个可以在阿里云官网申请得到 拿到OCS之后 进入OCS控制台,点击下面的客户端下载选择.Net客 ...

  7. AJAX2.0

    Ajax2.0 早期的ajax技术不支持异步文件上传 在后面更新了ajax2.0版本  支持文件上传了 但需要借助一个对象----FormData对象 Ajax2.0大体的步骤跟以前是一样的  但也是 ...

  8. 【共享单车】—— React后台管理系统开发手记:AntD Table高级表格

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  9. Angular 学习笔记——ng-animate

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...

  10. 【转载】 json字符串与JSON对象

    ajax中,我们自己拼接的是一个JSON对象,以为它是无数据类型的,所以JS根据其格式默认其实对象, 你要是往后台发,要先把它装换成JSON字符. 从ajax的服务器发过的,一定是字符串,你想要把它解 ...