假设有共享的资源sum,与之相关联的mutex 是lock_s.假设每个线程对sum的操作很简单的,与sum的状态无关,比如只是sum++.那么只用mutex足够了.程序员只要确保每个线程操作前,取得lock,然后sum++,再unlock即可.每个线程的代码将像这样

如果操作比较复杂,假设线程t0,t1,t2的操作是sum++,而线程t3则是在sum到达100的时候,打印出一条信息,并对sum清零. 这种情况下,如果只用mutex, 则t3需要一个循环,每个循环里先取得lock_s,然后检查sum的状态,如果sum>=100,则打印并清零,然后unlock.如果sum& amp; amp; amp; lt;100,则unlock,并sleep()本线程合适的一段时间.

这个时候,t0,t1,t2的代码不变,t3的代码如下:

这种办法有两个问题

1) sum在大多数情况下不会到达100,那么对t3的代码来说,大多数情况下,走的是else分支,只是lock和unlock,然后sleep().这浪费了CPU处理时间.

2) 为了节省CPU处理时间,t3会在探测到sum没到达100的时候sleep()一段时间.这样却又带来另外一个问题,亦即t3响应速度下降.可能在sum到达200的时候,t3才醒过来.

3) 这样,程序员在设置sleep()时间的时候陷入两难境地,设置得太短了节省不了资源,太长了又降低响应速度.真是难办啊!

这个时候,condition variable内裤外穿,从天而降,拯救了焦头烂额的你. (抄袭的哈哈~)

你首先定义一个condition variable.

pthread_cond_t cond_sum_ready=PTHREAD_COND_INITIALIZER;

t0,t1,t2的代码只要后面加两行,像这样

注意两点: 1) 在thread_cond_wait()之前,必须先lock相关联的mutex, 因为假如目标条件未满足,pthread_cond_wait()实际上会unlock该mutex, 然后block,在目标条件满足后再重新lock该mutex, 然后返回. 2) 为什么是while(sum<100),而不是if(sum<100) ?这是因为在pthread_cond_signal()和pthread_cond_wait()返回之间,有时间差,假设在这个时间差内,还有另外一个线程t4又把sum减少到100以下了,那么t3在pthread_cond_wait()返回之后,显然应该再检查一遍sum的大小. 这就是用 while的用意

linux 多线程条件变量,linux多线程之条件变量相关推荐

  1. 【Linux C 多线程编程】互斥锁与条件变量

    一.互斥锁 互斥量从本质上说就是一把锁, 提供对共享资源的保护访问. 1) 初始化: 在Linux下, 线程的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化: 对于静态 ...

  2. 信号灯文件锁linux线程,linux——线程同步(互斥量、条件变量、信号灯、文件锁)...

    一.说明 linux的线程同步涉及: 1.互斥量 2.条件变量 3.信号灯 4.文件读写锁 信号灯很多时候被称为信号量,但个人仍觉得叫做信号灯比较好,因为可以与"SYSTEM V IPC的信 ...

  3. java线程条件变量_使用条件变量(多线程笔记)

    条件变量属性: 使用条件变量可以以原子方式阻塞线程,知道某个特定条件为真为止.条件变量始终与互斥锁一起使用. 使用条件变量,线程可以以原子方式阻塞,知道满足某个条件为止.对掉件的测试时在互斥锁的保护下 ...

  4. Linux先发送条件变量,linux 条件变量 浅谈Linux条件变量的使用

    想了解浅谈Linux条件变量的使用的相关内容吗,在本文为您仔细讲解linux 条件变量的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:linux,条件变量,下面大家一起来学习吧. Linu ...

  5. 【Linux学习笔记④】——Shell程序设计【变量 输入与输出 条件表达式 判断语句 循环语句 Shell函数】

    ⌛️ 文章目录 一.Shell 概述 二.Shell 脚本的定义与执行 2.1 Shell 脚本的定义 2.2 Shell 脚本的执行 三.Shell 变量 3.1 用户自定义变量 3.2 环境变量 ...

  6. 使用条件变量(多线程编程笔记)

    条件变量属性 使用条件变量可以以原子方式阻塞线程,直到某个特定条件为真为止.条件变量始终 与互斥锁一起使用. 使用条件变量,线程可以以原子方式阻塞,直到满足某个条件为止.对条件的测试是 在互斥锁(互斥 ...

  7. Linux【实操篇】—— Shell 编程入门、变量、运算符、条件判断、流程控制

    目录 一.Shell 编程入门 1. 认识 Shell 2. Shell 脚本的创建与执行 二.Shell 变量 1. 系统变量和自定义变量 2. 变量的基本规则 3. 设置环境变量 4. 位置参数变 ...

  8. posix多线程有感--线程高级编程(条件变量)

    1.初始化条件变量pthread_cond_init int pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr) ...

  9. Linux学习之系统编程篇:条件变量(pthread_cond_init / wait / signal / broadcast / destroy)

    一.条件变量的认识 (1)条件变量的引出: 各个线程访问共享资源,比如说共享资源是一个空资源,那么,各线程的访问其实都是无效访问,因此需要一个机制,首先阻塞线程,以免其错误访问,待条件满足时(比如 共 ...

  10. linux多线程编写哲学家,Linux系统编程(三) ------ 多线程编程

    一.线程的创建和调度 1.线程是程序执行的某一条指令流的映像. 为了进一步减少处理机制的空转时间,支持多处理器及减少上下文切换开销,进程在演化中出现了另一个概念--线程.它是进程内独立的一条运行路线, ...

最新文章

  1. 专访@爱可可-爱生活:如何做好科学研究(干货满满)
  2. ZooKeeper伪分布式集群安装
  3. MyBatis 与 Hibernate
  4. 数据结构之线性表:单链表
  5. python tableview 列宽_QTableView设置列宽
  6. python2.7读取csv文件_13.1. csv — CSV 文件读写 — Python 2.7.18 文档
  7. 基于Jquery的图片自动分组且自适应页面的缩略图展示特效
  8. numpy.linalg.eig() 计算方形矩阵的特征值和特征向量
  9. 动态生成节点与删除节点
  10. 支付那些事儿III---一个BD汪眼中的产品II
  11. FrameMaker 2019中文版
  12. 2020中兴捧月算法大赛——傅里叶赛道 第1名方案
  13. Java-醉汉行走问题
  14. 《东周列国志》第三十三回 宋公伐齐纳子昭 楚人伏兵劫盟主
  15. Z世代成为消费新主力,我国潮牌营销洞察报告​
  16. python新年快乐代码_Python第二天 祝大家新年快乐
  17. 查看本机mac地址/ ipconfig /all 的一点笔记
  18. 程序员去大公司面试,阿里P8面试官都说太详细了,社招面试心得
  19. BUGKU (Take the maze)
  20. Delphi 2007 体验

热门文章

  1. centos6.4安装apache php mysql_CentOS6.4下apache+php的简易搭建
  2. 三菱d700变频器接线图_昆明市三菱恒压供水变频器接线图
  3. 聊一聊 bootstrap 的轮播图插件
  4. linux 文件系统 启动,linux kernel文件系统启动部分
  5. 首款鸿蒙p系om统终端,华为全力赋能:首款鸿蒙系统终端荣耀智慧屏,距离上市销售倒计时...
  6. 设置Eclipse可以Debug模式调试JDK源码,并显示局部变量的值
  7. malloc 和alloc及calloc的区别
  8. libevent多线程使用bufferevent的那些事
  9. HTML中如何写for循环全选,利用html:multibox 循环遍历checkbox 并且全选全解除
  10. Java继承_Java面试题总结(一)