再次看到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. 十. 图形界面(GUI)设计2.框架窗口

    窗口是GUI编程的基础,小应用程序或图形界面的应用程序的可视组件都放在窗口中,在GUI中,窗口是用户屏幕的一部分,起着在屏幕中一个小屏幕的作用.有以下三种窗口: Applet窗口:Applet类管理这 ...

  2. UIPanGestureRecognizer判断滑动的方向

    .h文件 CGFloat const gestureMinimumTranslation = 20.0 ; typedef enum : NSInteger { kCameraMoveDirectio ...

  3. linux之ifconfig命令

    1.命令格式: ifconfig [网络设备] [参数] 2.命令功能: ifconfig 命令用来查看和配置网络设备.当网络环境发生改变时可通过此命令对网络进行相应的配置. 3.命令参数: up 启 ...

  4. delphi 浮点数转换成十六进制字符串的方法

    我们在研究封包技术时,经常会碰到将浮点数转换成十六进制形式.比如在游戏中人物的座标,经常就用浮点数来表示.怎么将浮点数转换成十六进制字符串形式呢?下面我将写出其在DELPHI中的方法.       先 ...

  5. 大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5)

                                                        大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5) 上一节中,我们讲 ...

  6. 关于C++中_finite()函数的说明 [转]

    The function int _finite(double x) returns 1 (true) if x is an ordinary number and 0 (false) if x is ...

  7. SparkSQL的3种Join实现

    引言 Join是SQL语句中的常用操作,良好的表结构能够将数据分散在不同的表中,使其符合某种范式,减少表冗余.更新容错等.而建立表和表之间关系的最佳方式就是Join操作. 对于Spark来说有3中Jo ...

  8. Linux学习之二十一-shell编程基础

    Shell编程基础 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个 ...

  9. Win7下nginx默认80端口被System占用,造成nginx启动报错的解决方案

    Win7下nginx默认80端口被System占用,造成nginx启动报错的解决方案   在win7 32位旗舰版下,启动1.0.8版本nginx,显示如下错误:  [plain] 2012/04/0 ...

  10. 2016.6.20 tomcat端口始终被占用

    我在使用tomcat7时,服务开启时,始终提示端口被占用. 但是从进程中又看不到开启的tomcat. 最后在资源监视器中,结束重复开启的tomcat. (注意是资源监视器,刚开始的时候看成管理器,怎么 ...