原子操作、锁、同步实现原理
参考大哥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起到了一个分布式锁的作用,具体情 ...
最新文章
- 云计算已成创新基础设施,三大暗流左右未来“云市场”
- Docker容器相关命令
- QT的QScroller类的使用
- 字体--Ubuntu手记之系统配置
- Android官方开发文档Training系列课程中文版:手势处理之监测通用手势
- 简述oracle数据库特殊状态,【OracleDB】 01 概述和基本操作
- 携程Apollo分布式配置中心搭建指南
- 一些html5和css3的一些常见面试题
- Idea集成springboot报错(cound not autowire)
- java泊松分布_Java中利用Math.random()产生服从泊松分布的随机数
- 被投毒的管道:研究员探索CI环境中的攻击方法
- mac remix导入本地项目
- Java疯狂讲义读书笔记第五章
- 2018计算机应用基础教材,2018年计算机应用基础课件全套PPT电子档.ppt
- uni-app知识点整理(1)- uni-app简介、环境搭建、项目创建、项目目录文件
- CSP开发基础--CSP入门简介
- 南朝皇帝简介-20170604
- matlab竖向正负柱状图,echarts竖向正负柱状图【如何用EXCEL做正负柱状图?请高手指点,谢谢】...
- 【自然语言处理】【ChatGPT系列】大模型的涌现能力
- 2018航电多校练习第9场-快速幂
热门文章
- 阿里云安全组已经开放端口但是服务器端口还是不能访问
- CSS单位中px、en和rer的区别?
- linux springboot开机启动,SpringBoot 部署到Linux开机自启动和运行
- Linux单机到Windows的OGG安装部署步骤
- java.util.concurrent.TimeoutException: Waited 3000 milliseconds (plus 2 milliseconds, 351400 nanosec
- 黑马程序员---java算法实现输出任意奇数维数独
- 5-RNN-01_字符集RNN
- 8000 sentences of Oral English(one)
- 守护绿水青山,环保数采仪一马当先!
- python找不到指定模块sklearn怎么办_python中sklearn找不到指定模块怎么办