Android系统中提供的原子操作
代码的实现位于文件system/core/include/cutils中
http://androidxref.com/4.4.3_r1.1/xref/system/core/include/cutils/atomic.h
17#ifndef ANDROID_CUTILS_ATOMIC_H
18#define ANDROID_CUTILS_ATOMIC_H
23#ifdef __cplusplus
24extern "C" {
25#endif
27/*
28 * A handful of basic atomic operations. The appropriate pthread
29 * functions should be used instead of these whenever possible.
30 *
31 * The "acquire" and "release" terms can be defined intuitively in terms
32 * of the placement of memory barriers in a simple lock implementation:
33 * - wait until compare-and-swap(lock-is-free --> lock-is-held) succeeds
34 * - barrier
35 * - [do work]
36 * - barrier
37 * - store(lock-is-free)
38 * In very crude terms, the initial (acquire) barrier prevents any of the
39 * "work" from happening before the lock is held, and the later (release)
40 * barrier ensures that all of the work happens before the lock is released.
41 * (Think of cached writes, cache read-ahead, and instruction reordering
42 * around the CAS and store instructions.)
43 *
44 * The barriers must apply to both the compiler and the CPU. Note it is
45 * legal for instructions that occur before an "acquire" barrier to be
46 * moved down below it, and for instructions that occur after a "release"
47 * barrier to be moved up above it.
48 *
49 * The ARM-driven implementation we use here is short on subtlety,
50 * and actually requests a full barrier from the compiler and the CPU.
51 * The only difference between acquire and release is in whether they
52 * are issued before or after the atomic operation with which they
53 * are associated. To ease the transition to C/C++ atomic intrinsics,
54 * you should not rely on this, and instead assume that only the minimal
55 * acquire/release protection is provided.
56 *
57 * NOTE: all int32_t* values are expected to be aligned on 32-bit boundaries.
58 * If they are not, atomicity is not guaranteed.
59 */
61/*
62 * Basic arithmetic and bitwise operations. These all provide a
63 * barrier with "release" ordering, and return the previous value.
64 *
65 * These have the same characteristics (e.g. what happens on overflow)
66 * as the equivalent non-atomic C operations.
67 */
68int32_t android_atomic_inc(volatile int32_t* addr);
69int32_t android_atomic_dec(volatile int32_t* addr);
70int32_t android_atomic_add(int32_t value, volatile int32_t* addr);
71int32_t android_atomic_and(int32_t value, volatile int32_t* addr);
72int32_t android_atomic_or(int32_t value, volatile int32_t* addr);
74/*
75 * Perform an atomic load with "acquire" or "release" ordering.
76 *
77 * This is only necessary if you need the memory barrier. A 32-bit read
78 * from a 32-bit aligned address is atomic on all supported platforms.
79 */
80int32_t android_atomic_acquire_load(volatile const int32_t* addr);
81int32_t android_atomic_release_load(volatile const int32_t* addr);
83/*
84 * Perform an atomic store with "acquire" or "release" ordering.
85 *
86 * This is only necessary if you need the memory barrier. A 32-bit write
87 * to a 32-bit aligned address is atomic on all supported platforms.
88 */
89void android_atomic_acquire_store(int32_t value, volatile int32_t* addr);
90void android_atomic_release_store(int32_t value, volatile int32_t* addr);
92/*
93 * Compare-and-set operation with "acquire" or "release" ordering.
94 *
95 * This returns zero if the new value was successfully stored, which will
96 * only happen when *addr == oldvalue.
97 *
98 * (The return value is inverted from implementations on other platforms,
99 * but matches the ARM ldrex/strex result.)
100 *
101 * Implementations that use the release CAS in a loop may be less efficient
102 * than possible, because we re-issue the memory barrier on each iteration.
103 */
104int android_atomic_acquire_cas(int32_t oldvalue, int32_t newvalue,
106int android_atomic_release_cas(int32_t oldvalue, int32_t newvalue,
这是个跟处理器相关的一个函数,它执行原子性的加1操作可能更有效率。它的用法是这样,如果oldvalue等于* addr则赋值给* addr,返回0,否则返回1
109/*
110 * Aliases for code using an older version of this header. These are now
111 * deprecated and should not be used. The definitions will be removed
112 * in a future release.
113 */
114#define android_atomic_write android_atomic_release_store
115#define android_atomic_cmpxchg android_atomic_release_cas
117#ifdef __cplusplus
118} // extern "C"
119#endif
121#endif // ANDROID_CUTILS_ATOMIC_H
QQ群 计算机科学与艺术 272583193
加群链接:http://jq.qq.com/?_wv=1027&k=Q9OxMv
Android系统中提供的原子操作的更多相关文章
- Android系统中的广播(Broadcast)机制简要介绍和学习计划
在Android系统中,广播(Broadcast)是在组件之间传播数据(Intent)的一种机制:这些组件甚至是可以位于不同的进程中,这样它就像Binder机制一样,起到进程间通信的作用:本文通过一个 ...
- Android系统中是否开启定位及定位模式的判断
1.关于Android系统中不同的定位模式 Android系统中包括3中定位模式: 使用GPS.WLAN和移动网络 使用WLAN和移动网络 仅使用GPS 截图 特点 同时使用GPS.WIFI及基站 ...
- android系统中对ffmpeg封装最好的免费SDK
android系统中对ffmpeg封装最好的免费SDK; 无论个人还是公司,都免费商用, 欢迎下载. https://github.com/LanSoSdk/LanSoEditor_common 可能 ...
- AIDL在android系统中的作用
AIDL,Android Interface definition language的缩写,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口.最近看了下AIDL在A ...
- Android系统中的6种模式
Android系统中的6种模式 1:一般启动模式(normal mode): 功能是正常启动手机,方法为关机状态下按电源键启动. 2:安全模式(safe mode): 此模式和正常启动一样 ...
- [原创]Android系统中常用JAVA类源码浅析之HashMap
由于是浅析,所以我只分析常用的接口,注意是Android系统中的JAVA类,可能和JDK的源码有区别. 首先从构造函数开始, /** * Min capacity (other than zero) ...
- Android系统中 setprop,getprop,watchprops命令的使用
如:在frameworks/opt/net/ims/src/java/com/android/ims/ImsManager.java if (SystemProperties.get("pe ...
- 用adb pull命令从android系统中读取文件失败的原因及解决办法
问题:使用adb pull命令从android系统中读取文件失败.显示:Permission denied 原因:是由于文件权限原因引起. 使用ls -l命令查看android系统中的 ...
- Android系统中的dp和px的转换
android系统中DP和SP的转化:1.首先分析TypedValue.java 可以调用以下代码获得dp的值 TypedValue.applyDimension(TypedValue.COMPLEX ...
随机推荐
- 【M15】了解异常处理(exception handling)的成本
1.为了在运行期处理异常,程序必须做大量额外的工作.比如,即使抛出异常,也必须保证离开作用域的栈上对象执行析构方法.因此,必须记录try语句的进入点和离开点,记录catch语句能够处理的异常等.这就意 ...
- C# 函数覆盖总结学习
覆盖类成员:通过new关键字修饰虚函数表示覆盖该虚函数.一个虚函数被覆盖后,任何父类变量都不能访问该虚函数的具体实现.public virtual void IntroduceMyself(){... ...
- Android动画的实现 上
在Android系统中也能经常见到动画,那么如何实现动画效果呢?本文就来为大家介绍动画的实现方式. Android中动画的实现分两种方式,一种方式是补间动画Tween Animation,就是说你定义 ...
- 修复 MySQL 数据库结构错误 – mysql_upgrade升级
http://www.cnblogs.com/wjoyxt/p/5477072.html 不知道是不是每次更新 MySQL 软件之后都需要执行数据库升级指令?在我进行过的几次软件升级之后,总会在 My ...
- c语言指针函数与函数指针
例一:指针函数 指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个 ...
- 深入研究Block用weakSelf、strongSelf、@weakify、@strongify解决循环引用(上)
深入研究Block捕获外部变量和__block实现原理 前言 在上篇中,仔细分析了一下Block的实现原理以及__block捕获外部变量的原理.然而实际使用Block过程中,还是会遇到一些问题,比如R ...
- CSS拾遗+技巧集合
1.实现尖角符号. 这是内联inline-block标签独有的特性. <!DOCTYPE html> <html lang="en"> <head&g ...
- Debian 7 安装 Docker
Debian 7更新内核到3.16后 一.添加docker源 在source.list中加入: # Docker Repo deb https://get.docker.io/ubuntu docke ...
- SSIS 学习(1): 概要【转】
俗话说:“十年磨一剑”,Microsoft 通过5年时间的精心打造,于2005年浓重推出Sql Server 2005,这是自SQL Server 2000 以 后的又一旷世之作.这套企业级的数据库解 ...
- height、clientHeight、scrollHeight、offsetHeight区别
转自 http://www.cnblogs.com/yuteng/articles/1894578.html 我们来实现test中的onclick事件 function justAtest() ...