Android原子操作——android_atomic_cmpxchg
网络给我们带来了很多方便,查阅我们目前认知范围外的道理。但是,凡事也要学会分辨,不然可能会误导你。
话说,最近的一个项目(Mercury-Project),接近尾声中。然而,在调试一个demo时,却遇到了问题。
理一下问题由来:
1.目标:将Android下的一些基础工具移植到纯正Linux平台上用。
2.移植RefBase时,用到了原子操作:
android_atomic_cmpxchg(curCount, curCount+1, &impl->mStrong)
怎么办呢?因为这个api是Android实现的一套底层原子操作(应付并发场景下比较+交换操作的原子性要求),因此需要寻找通用Linux平台所对应的api。
是什么呢?这个:__sync_bool_compare_and_swap(),其原型为:bool __sync_bool_compare_and_swap (type *ptr, type oldval, type newval)
需要注意的是,这个是gcc提供的api,而非OS提供的。
3.如何替换?
分析gcc的CAS的原型:bool __sync_bool_compare_and_swap(type *ptr, type oldval, type newval)
这个CAS函数,功能为:比较oldval与*ptr的值,如何相等,则用newval更新*ptr的值,否则不更新;当更新时,返回true,不跟新时,返回false。
Android的这个api原型:int android_atomic_cmpxchg(int32_t oldvalue, int32_t newvalue, volatile int32_t* addr)
然而,这个函数,网上一大片错的!估计都没验证过,就抄过来抄过去。呵呵。。。
截取网上找到的两段:

我也天真的相信了,移植时,将如下代码:
if (android_atomic_cmpxchg(curCount, curCount+1, &impl->mStrong) == 0)
修改为了:
if (__sync_bool_compare_and_swap(&impl->mStrong, curCount, curCount+1) == 0)
4.问题出现:
在跑demo,验证RefBase时,将对象进行promote时,等待了近一分钟,才执行完!
回来查问题,才定位到,是这个CAS函数替换引入的!
5.api真正的功能是什么?
参考api说明:http://androidxref.com/4.4.4_r1/xref/system/core/include/cutils/atomic.h#115
以及实现:http://androidxref.com/4.4.4_r1/xref/system/core/include/cutils/atomic-arm.h#108
截下来:

如果看不懂汇编,看最后一行的return语句,也猜的八九不离十:相等时,返回0;不等时,返回1。
这一段API接口说明要仔细读:

110-112行说,这个两个接口是新API(android_atomic_release_cas)的别名,在将来可能被移除掉,不建议再用此API。
再看95-96行的说明,返回zero,只有在*addr==oldvalue时,才发生!!!
第98行,补充说,在其他平台(非ARM平台)上,根据具体的实现,返回值是反的。
Android原子操作——android_atomic_cmpxchg的更多相关文章
- Android系统中提供的原子操作
代码的实现位于文件system/core/include/cutils中 http://androidxref.com/4.4.3_r1.1/xref/system/core/include/cuti ...
- [深入理解Android卷一全文-第八章]深入理解Surface系统
由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版.而知识的传播不应该由于纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容. ...
- Android Framework中Thread类
Thread类是Android为线程操作而做的一个封装.代码在Thread.cpp中,其中还封装了一些与线程同步相关的类. Thread类 Thread类的构造函数中的有一个canCallJava T ...
- Android线程管理之Thread使用总结
前言 最近在一直准备总结一下Android上的线程管理,今天先来总结一下Thread使用. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Executo ...
- android开发读书笔记
第九章心得: HAL ( Hardware Abstraction Layer,硬件抽象腔,〉是建立在Linux驱动之上的一套翻字库.这套程序 j率并不属于 Linux 内核, 而是属于 Linux ...
- Android智能指针sp wp详解
研究Android的时候,经常会遇到sp.wp的东西,网上一搜,原来是android封装了c++中对象回收机制.说明:1. 如果一个类想使用智能指针,那么必须满足下面两个条件: a. 该类是虚基 ...
- (原创)android Sqlite多线程访问异常解决方案
在开发Android的程序的时候sqlite数据库是经常用到的:在多线程访问数据库的时候会出现这样的异常:java.lang.IllegalStateException: Cannot perform ...
- android 常见死机问题--log分析
http://blog.csdn.net/fangchongbory/article/details/7645815 android 常见死机问题--log分析============ ...
- Android 设计模式 之 单例模式
http://blog.csdn.net/fangchongbory/article/details/7734199 目录(?)[+] 单例模式常见情景 首先实现1中的单例模式A 实现2中单例模式 ...
随机推荐
- Java中常量池详解
在Java的内存分配中,总共3种常量池: 转发链接:https://blog.csdn.net/zm13007310400/article/details/77534349 1.字符串常量池(Stri ...
- kali ms17_010 内网环境下渗透笔记
一.先用Router Scan 扫描 看清楚了网络拓扑结构. 二.使用MS17-010批量扫描工具 下载:ms17-010Scan.exe (也可以用kali自带的nmap和ms17-10模块扫) ...
- Mysql预处理语句prepare、execute、deallocate
前言 做CTF题的时候遇到的所以参考资料学习一波.... MySQL的SQL预处理(Prepared) 一.SQL 语句的执行处理 1.即时 SQL 一条 SQL 在 DB 接收到最终执行完毕返回,大 ...
- TestLink在线Excel用例转换xml
[原文链接]:https://blog.tecchen.tech ,博文同步发布到博客园. 由于精力有限,对文章的更新可能不能及时同步,请点击上面的原文链接访问最新内容. 欢迎访问我的个人网站:htt ...
- FL Studio钢琴卷轴之画笔工具
在FL Studio中,钢琴卷轴窗口是制作音乐很重要的一个窗口,大部分音乐编辑的工作都要在该窗口中完成.钢琴卷轴的概念来源于旧时自动机械钢琴所使用的纸质卷轴,在钢琴卷轴中,纵轴代表音符的高度,横轴代表 ...
- 你也想当流量UP主?那就点开看看吧!
2009年6月份,哔哩哔哩(B站)在一众期待中诞生,它汇聚了天南海北当时小众的二次元同好,它也存在诸多不足,大家亲切地叫它"小破站". 而如今,它成长为一棵枝繁叶茂的参天大树,成为 ...
- leetcode 33和 leetcode81 II
//接上上一篇博客,继续这个题目,现在数组中会有重复元素,情况将会变得十分复杂,比如说1,1,1,1,1 或者1,1,3,1再来 3,3,3,1,1,1,3,这些都是可以的,都是符合题目要求的,如 ...
- 基于混沌Logistic加密算法的图片加密与还原
摘要 一种基于混沌Logistic加密算法的图片加密与还原的方法,并利用Lena图和Baboon图来验证这种加密算法的加密效果.为了能够体现该算法在图片信息加密的效果,本文还采用了普通行列置乱加密算法 ...
- CentOS下的IPMI尝试
1.载入支持 ipmi 功能的系统模块 modprobe ipmi_msghandler modprobe ipmi_devintf modprobe ipmi_poweroff modprobe i ...
- 课时四:Action操作
参考文档 瑞泰信息技术有限公司 微软MVP(15-18)罗勇 语义说明 核心名词 FetchXML:是基于Xml的查询语言,可以把它简单理解成SQL语句,通过它可以查询Dynamics 365 C ...