网络给我们带来了很多方便,查阅我们目前认知范围外的道理。但是,凡事也要学会分辨,不然可能会误导你。

话说,最近的一个项目(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的更多相关文章

  1. Android系统中提供的原子操作

    代码的实现位于文件system/core/include/cutils中 http://androidxref.com/4.4.3_r1.1/xref/system/core/include/cuti ...

  2. [深入理解Android卷一全文-第八章]深入理解Surface系统

    由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版.而知识的传播不应该由于纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容. ...

  3. Android Framework中Thread类

    Thread类是Android为线程操作而做的一个封装.代码在Thread.cpp中,其中还封装了一些与线程同步相关的类. Thread类 Thread类的构造函数中的有一个canCallJava T ...

  4. Android线程管理之Thread使用总结

    前言 最近在一直准备总结一下Android上的线程管理,今天先来总结一下Thread使用. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Executo ...

  5. android开发读书笔记

    第九章心得: HAL ( Hardware Abstraction Layer,硬件抽象腔,〉是建立在Linux驱动之上的一套翻字库.这套程序 j率并不属于 Linux 内核, 而是属于 Linux ...

  6. Android智能指针sp wp详解

    研究Android的时候,经常会遇到sp.wp的东西,网上一搜,原来是android封装了c++中对象回收机制.说明:1. 如果一个类想使用智能指针,那么必须满足下面两个条件:    a. 该类是虚基 ...

  7. (原创)android Sqlite多线程访问异常解决方案

    在开发Android的程序的时候sqlite数据库是经常用到的:在多线程访问数据库的时候会出现这样的异常:java.lang.IllegalStateException: Cannot perform ...

  8. android 常见死机问题--log分析

    http://blog.csdn.net/fangchongbory/article/details/7645815         android 常见死机问题--log分析============ ...

  9. Android 设计模式 之 单例模式

    http://blog.csdn.net/fangchongbory/article/details/7734199   目录(?)[+] 单例模式常见情景 首先实现1中的单例模式A 实现2中单例模式 ...

随机推荐

  1. Angular 之装饰器@Input

    Input 一个装饰器,用来把某个类字段标记为输入属性,并提供配置元数据. 该输入属性会绑定到模板中的某个 DOM 属性.当变更检测时,Angular 会自动使用这个 DOM 属性的值来更新此数据属性 ...

  2. 使用Actor模型管理Web Worker多线程

    前端固有的编程思维是单线程,比如JavaScript语言的单线程.浏览器JS线程与UI线程互斥等等,Web Woker是HTML5新增的能力,为前端带来多线程能力.这篇文章简单记录一下搜狗地图WebG ...

  3. 云计算之路-出海记:建一个免费仓库 Amazon RDS for SQL Server

    上周由于园子后院起火,不得不调兵回去救火,出海记暂时停更,这周继续更新,"出海记"记录的是我们在 AWS 上建设博客园海外站的历程. 在这一记中记录的是我们基于 AWS 免费套餐( ...

  4. Vegas常见问题解答,如何处理预览卡顿

    制作视频并不是简单的拼拼凑凑,很多时候我们都需要给视频加上一些视频特效或转场等效果,如果只是图片素材的话,还不会出现卡顿的现象,但是当你给视频添加了效果后,在预览窗口看到的就是非常卡顿了.除了本身计算 ...

  5. jQuery 第六章 实例方法 动画

    .show() .hide() .toggle() .fadeIn() .fadeout() .fadeToggle() .fadeTo() .slideDown() .slideUp() .slid ...

  6. 电脑adb命令给智能电视安装APK

    配置环境 1.电脑需要配置好adb系统环境 具体操作较复杂,请自行百度. 2.电视打开adb命令 在电视的关于界面通过遥控器「上上下下左右左右」进入工厂模式,在「高级设置」-「其他」中的「adb开关」 ...

  7. 【python】Matplotlib作图中有多个Y轴

    在作图过程中,需要绘制多个变量,但是每个变量的数量级不同,在一个坐标轴下作图导致曲线变化很难观察,这时就用到多个坐标轴.本文除了涉及多个坐标轴还包括Axisartist相关作图指令.做图中label为 ...

  8. C++之父接受采访:对 C++ 成功的关键和发展历程进行了回顾

    C++ 的起源可以追溯到 40 年前,但它仍然是当今使用最广泛的编程语言之一. 到 2020 年 9 月为止,C++ 是仅次于 C 语言.Java 和 Python,位于全球第四的编程语言.根据最新的 ...

  9. django中的积累

    只要继承了model.Model, 就会生成一个新的表,但是,如果在Meta方法中添加abstract=True,就不会产生新的表,而是作为一个基类存放多个表共同拥有的方法和字段等 from djan ...

  10. gsap基础一[from,to,fromTo]

    学了几天基础了,感觉总算有点入了一个门的感觉啦,gasp不难,想想一年前我看着官网跟天文一样,今年真的进步很大,在外网发现学习的新世界, 自己的获取知识和查看api源码的能力也增强了许多,现在国内的气 ...