原子操作、锁、同步实现原理
参考大哥http://www.sohu.com/a/248902628_100063030
在多线程环境下,i++并不安全。使用两个线程同时操作i++ 1w万次,可能得出i的值并不是2w。想要安全的使用i++, 在java上可以使用synchronized关键字, c/c++语言中可以使用pthread_mutex_lock。c的sleep函数也同样让我着迷,它可以让线程“暂停”,想不通它是怎么做到的。但感觉它们应该有共性的,抢占一个被占用的锁时是要出现“等待”的。
1. 原子操作i++以前维护过一个c/c++项目,它实现了一套的引用计数来管理对象。跟踪它在增加引用计数时调用了android_atomic_inc,android_atomic_inc又调用了android_atomic_add,android_atomic_add函数是内嵌汇编实现的:
(注:文中代码均可左右滑动)xtern ANDROID_ATOMIC_INLINE
int32_t android_atomic_add(int32_t increment, volatile int32_t *ptr)
{
int32_t prev, tmp, status;
android_memory_barrier();
do {
__asm__ __volatile__ ("ldrex %0, [%4]\n"
"add %1, %0, %5\n"
"strex %2, %1, [%4]"
: "=&r" (prev), "=&r" (tmp),
"=&r" (status), "+m" (*ptr)
: "r" (ptr), "Ir" (increment)
: "cc");
} while (__builtin_expect(status != 0, 0));
return prev;
}
第一眼看上去,肯定会怀疑代码是不是找错了,怎么会有一个循环呢?我们慢慢分析一下,依据c/c++调用汇编参数传递格式,可以列出下表:
do {依据这个表可以把上面汇编代码转换成伪代码:
tmp = *ptr;
tmp = tmp + increment;
*ptr = tmp;
} while (status != 0);
这很好理解,关键是怎样达到原子操作(线程安全)呢,就是ldrex和strex指令的功能了,两条指令的官方文档:
主要看Operation栏。指令ldrex在取值时会在对应内存上做一个exclusive access标记;指令strex存值时有这个标记就会存值成功,返回0,没有这个标记就会存值失败,返回1。这个标记就是独占式访问标记,是针对cpu的,多核环境下也没有问题。
原子操作、锁、同步实现原理相关推荐
- synchronized实现同步的原理和锁状态
参考自美团技术团队. 一.synchronized实现同步的原理 我们需要了解两个重要的概念:"Java对象头"."Monitor". 1.对象头 synchr ...
- Redis如何实现分布式锁延时队列以及限流应用丨Redis源码原理|跳表|B+树|分布式锁|中间件|主从同步|存储原理
Redis如何实现分布式锁延时队列以及限流应用 视频讲解如下,点击观看: Redis如何实现分布式锁延时队列以及限流应用丨Redis源码原理|跳表|B+树|分布式锁|中间件|主从同步|存储原理|数据模 ...
- handler原子锁_Linux的原子操作与同步机制
Linux的原子操作与同步机制 并发问题 现代操作系统支持多任务的并发,并发在提高计算资源利用率的同时也带来了资源竞争的问题.例如C语言语句"count++;"在未经编译器优化时生 ...
- python互斥锁原理_Linux 互斥锁的实现原理(pthread_mutex_t)
引言 互斥锁大都会使用,但是要了解其原理就要花费一番功夫了.尽管我们说互斥锁是用来保护一个临界区,实际上保护的是临界区中被操纵的数据. 互斥锁还是分为三类:快速互斥锁/递归互斥锁/检测互斥锁 fute ...
- 理解:iOS开发中锁的实现原理
摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大量的实战经验,另一方面这样的文章相当多,比如 iOS中保证线程安全的几种方式与性能对比.iOS 常见知识点(三):Lock.本文也不 ...
- windows系统多线程同步机制原理总结
windows系统多线程同步机制原理总结 同步问题是开发过程中遇到的重要问题之一.同步是要保证在并发执行的环境中各个控制流可以有序地执行,包括对于资源的共享或互斥访问,以及代码功能的逻辑顺序. 为了保 ...
- Java乐观锁的实现原理和典型案例
Java乐观锁的实现原理 什么是乐观锁? 在并发编程中,多个线程同时对同一资源进行操作时,需要使用锁来保证数据的一致性. 乐观锁与悲观锁是两种不同的锁机制. 悲观锁会在整个操作期间占用资源的独占性,以 ...
- 快来学习Redis 分布式锁的背后原理
以前在学校做小项目的时候,用到Redis,基本也只是用来当作缓存.可阿粉在工作中发现,Redis在生产中并不只是当作缓存这么简单.在阿粉接触到的项目中,Redis起到了一个分布式锁的作用,具体情况是这 ...
- Alibaba Dubbo框架同步调用原理分析-1
2019独角兽企业重金招聘Python工程师标准>>> 由于Dubbo底层采用Socket进行通信,自己对通信理理论也不是很清楚,所以顺便把通信的知识也学习一下. n 通信理论 计 ...
- 还不知道 Redis 分布式锁的背后原理?还不赶快学习一下
前言 以前在学校做小项目的时候,用到Redis,基本也只是用来当作缓存.可阿粉在工作中发现,Redis在生产中并不只是当作缓存这么简单.在阿粉接触到的项目中,Redis起到了一个分布式锁的作用,具体情 ...
最新文章
- mysql帐号,权限管理
- 在Linux中如何禁止用户登录
- 基于Spark的大规模推荐系统特征工程
- (0073)iOS开发之核心动画高级技巧
- 一致吗 驱动_外国不过春节?AMD驱动再更新,解决BUG,游戏不闪退,重启不黑屏...
- 为什么要用动态代理?静态代理与动态代理详解
- Python能做什么事?为什么人工智能一定要学Python?
- 下拉框的value值怎么设置为变量_自绘制HT For Web ComboBox下拉框组件
- C++ 学习基础篇(一)—— C++与C 的区别
- 草稿 9203 作业重点关注
- python文件命名 数字,当文件存在时,文件名中的数字递增
- 智慧城市、智慧园区、智慧交通、行业经营看板、运行管理大屏、图表模板、公司经营看板、大屏可视化、BI可视化模板、智慧工厂、办公、能源、餐饮、校园、人力资源、行政、汽车、房地产、保险、医院、axure原型
- Swarm搭建Docker集群
- PPT怎么切换不同的母版
- springboot微信授权登录
- 数学建模课程设计-住房的合理定价问题
- 连接查询之内连接(等值连接、非等值连接和自连接)
- Clipper库 | 类型和填充规则
- 使用arch-anywhere来安装arch
- 敬业福终极攻略:马云的福字和这些图可多扫十几张福卡
热门文章
- 检查评分汇总表缺项计算机,综合检查评分表.docx
- 系统盘无损迁移至固态硬盘(机械硬盘)
- html怎么改变网页整体的大小,html设置浏览器大小
- RGMII_PHY测试笔记1 基于开发板MiS603-X25
- 增量式编码器与绝对值编码器的区别
- 跨年巨作 13万字 腾讯高工手写JDK源码笔记 带你飙向实战
- consol32.exe
- 作为应届生到底是去大的IT公司好,还是去小的IT公司好?
- managed-schema配置文件详解
- 巴比特 | 元宇宙每日必读:微博动漫将招募全球各类虚拟偶像并为其提供扶持...