linux 多线程条件变量,linux多线程之条件变量
假设有共享的资源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多线程之条件变量相关推荐
- 【Linux C 多线程编程】互斥锁与条件变量
一.互斥锁 互斥量从本质上说就是一把锁, 提供对共享资源的保护访问. 1) 初始化: 在Linux下, 线程的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化: 对于静态 ...
- 信号灯文件锁linux线程,linux——线程同步(互斥量、条件变量、信号灯、文件锁)...
一.说明 linux的线程同步涉及: 1.互斥量 2.条件变量 3.信号灯 4.文件读写锁 信号灯很多时候被称为信号量,但个人仍觉得叫做信号灯比较好,因为可以与"SYSTEM V IPC的信 ...
- java线程条件变量_使用条件变量(多线程笔记)
条件变量属性: 使用条件变量可以以原子方式阻塞线程,知道某个特定条件为真为止.条件变量始终与互斥锁一起使用. 使用条件变量,线程可以以原子方式阻塞,知道满足某个条件为止.对掉件的测试时在互斥锁的保护下 ...
- Linux先发送条件变量,linux 条件变量 浅谈Linux条件变量的使用
想了解浅谈Linux条件变量的使用的相关内容吗,在本文为您仔细讲解linux 条件变量的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:linux,条件变量,下面大家一起来学习吧. Linu ...
- 【Linux学习笔记④】——Shell程序设计【变量 输入与输出 条件表达式 判断语句 循环语句 Shell函数】
⌛️ 文章目录 一.Shell 概述 二.Shell 脚本的定义与执行 2.1 Shell 脚本的定义 2.2 Shell 脚本的执行 三.Shell 变量 3.1 用户自定义变量 3.2 环境变量 ...
- 使用条件变量(多线程编程笔记)
条件变量属性 使用条件变量可以以原子方式阻塞线程,直到某个特定条件为真为止.条件变量始终 与互斥锁一起使用. 使用条件变量,线程可以以原子方式阻塞,直到满足某个条件为止.对条件的测试是 在互斥锁(互斥 ...
- Linux【实操篇】—— Shell 编程入门、变量、运算符、条件判断、流程控制
目录 一.Shell 编程入门 1. 认识 Shell 2. Shell 脚本的创建与执行 二.Shell 变量 1. 系统变量和自定义变量 2. 变量的基本规则 3. 设置环境变量 4. 位置参数变 ...
- posix多线程有感--线程高级编程(条件变量)
1.初始化条件变量pthread_cond_init int pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr) ...
- Linux学习之系统编程篇:条件变量(pthread_cond_init / wait / signal / broadcast / destroy)
一.条件变量的认识 (1)条件变量的引出: 各个线程访问共享资源,比如说共享资源是一个空资源,那么,各线程的访问其实都是无效访问,因此需要一个机制,首先阻塞线程,以免其错误访问,待条件满足时(比如 共 ...
- linux多线程编写哲学家,Linux系统编程(三) ------ 多线程编程
一.线程的创建和调度 1.线程是程序执行的某一条指令流的映像. 为了进一步减少处理机制的空转时间,支持多处理器及减少上下文切换开销,进程在演化中出现了另一个概念--线程.它是进程内独立的一条运行路线, ...
最新文章
- 专访@爱可可-爱生活:如何做好科学研究(干货满满)
- ZooKeeper伪分布式集群安装
- MyBatis 与 Hibernate
- 数据结构之线性表:单链表
- python tableview 列宽_QTableView设置列宽
- python2.7读取csv文件_13.1. csv — CSV 文件读写 — Python 2.7.18 文档
- 基于Jquery的图片自动分组且自适应页面的缩略图展示特效
- numpy.linalg.eig() 计算方形矩阵的特征值和特征向量
- 动态生成节点与删除节点
- 支付那些事儿III---一个BD汪眼中的产品II
- FrameMaker 2019中文版
- 2020中兴捧月算法大赛——傅里叶赛道 第1名方案
- Java-醉汉行走问题
- 《东周列国志》第三十三回 宋公伐齐纳子昭 楚人伏兵劫盟主
- Z世代成为消费新主力,我国潮牌营销洞察报告​
- python新年快乐代码_Python第二天 祝大家新年快乐
- 查看本机mac地址/ ipconfig /all 的一点笔记
- 程序员去大公司面试,阿里P8面试官都说太详细了,社招面试心得
- BUGKU (Take the maze)
- Delphi 2007 体验
热门文章
- centos6.4安装apache php mysql_CentOS6.4下apache+php的简易搭建
- 三菱d700变频器接线图_昆明市三菱恒压供水变频器接线图
- 聊一聊 bootstrap 的轮播图插件
- linux 文件系统 启动,linux kernel文件系统启动部分
- 首款鸿蒙p系om统终端,华为全力赋能:首款鸿蒙系统终端荣耀智慧屏,距离上市销售倒计时...
- 设置Eclipse可以Debug模式调试JDK源码,并显示局部变量的值
- malloc 和alloc及calloc的区别
- libevent多线程使用bufferevent的那些事
- HTML中如何写for循环全选,利用html:multibox 循环遍历checkbox 并且全选全解除
- Java继承_Java面试题总结(一)