《深入理解Android》一3.5 原子操作

简介:

本节书摘来自华章出版社《深入理解Android》一书中的第3章,第3.5节,作者孟德国 王耀龙 周金利 黎欢,更多章节内容可以访问云栖社区“华章计算机”公众号查看

3.5 原子操作

原子操作因整个操作连续执行完毕不被打断而得名,它需要CPU提供指令级的支持。在多线程运行环境下有着非凡的意义,有了原子操作我们不必借助锁来实现原子上下文,大大减小小系统开销,进而可以实现免锁引用计数、用户态spinloc,以及高性能免锁算法等,比如著名的无锁队列MS-queue就是基于原子的比较交换指令来实现的。
WTF中提供的原子操作主要是原子的自增和自减操作,主要用于实现计数增减,在Android平台下的实现如下:
[→Atomics.h]

inline int atomicIncrement(int volatile* addend) 
{ return android_atomic_inc(addend); }
inline int atomicDecrement(int volatile* addend) 
{ return android_atomic_dec(addend); }

注意到其输入参数都是int volatile ,在C/C++的变量定义语境下,volatile与的位置关系和const与位置关系完全一样,这里volatile修饰int而不修饰,所以其参数为指向volatile int类型整数的指针。volatile保证了对变量的操作一定是直接对内存中的变量本身的操作。其中,android_atomic_inc是Android平台提供的函数,对于不同的硬件平台有不同的实现,但最终都是通过gcc内联汇编来实现的。

相关文章
|
存储 编解码 安全
Opus从入门到精通(二):编解码器使用
opus_encoder_get_size()返回编码器状态要求的大小。注意,这段代码的未来版本可能改变大小,所以没有assuptions应该对它做出。编码器状态在内存中总是连续,复制它只要一个浅拷贝就足够了。使用opus_encoder_ctl()接口可以改变一些编码器的参数设置。所有这些参数都已有缺省值,所以只在必要的情况下改变它们。
1855 0
|
11月前
|
存储 Linux Android开发
Android底层:通熟易懂分析binder:1.binder准备工作
本文详细介绍了Android Binder机制的准备工作,包括打开Binder驱动、内存映射(mmap)、启动Binder主线程等内容。通过分析系统调用和进程与驱动层的通信,解释了Binder如何实现进程间通信。文章还探讨了Binder主线程的启动流程及其在进程通信中的作用,最后总结了Binder准备工作的调用时机和重要性。
Android底层:通熟易懂分析binder:1.binder准备工作
|
安全 Linux 开发者
如何根据自己的开发板型号下载和配置交叉编译链
【8月更文挑战第25天】本指南详细介绍了如何为您的开发板下载和配置合适的交叉编译链。首先,需确定开发板的型号及其处理器架构(如ARM、MIPS等)。接着,可通过官方渠道或开源社区寻找适用的交叉编译链。下载时,请确保版本与开发板匹配并验证来源可靠性。配置过程包括解压文件、设置环境变量及验证配置正确性。最后,通过编译并运行简单的测试程序(如“Hello, World!”)来测试交叉编译链的有效性。若过程中遇到困难,建议查阅相关文档或求助于技术论坛。
230 1
|
消息中间件 Java 中间件
第十六章 Spring cloud stream应用
第十六章 Spring cloud stream应用
284 0
【Linux驱动学习(1)】USB与input子系统,linux统一设备模型,枚举,USB描述符深入剖析
【Linux驱动学习(1)】USB与input子系统,linux统一设备模型,枚举,USB描述符深入剖析
|
存储 缓存 编解码
FFmpeg开发笔记(四):ffmpeg解码的基本流程详解
FFmpeg开发笔记(四):ffmpeg解码的基本流程详解
FFmpeg开发笔记(四):ffmpeg解码的基本流程详解
|
机器学习/深度学习 Linux
linux 高级字符设备驱动 ioctl操作介绍 例程分析实现【转】
转自:http://my.oschina.net/u/274829/blog/285014 1,ioctl介绍 ioctl控制设备读写数据以及关闭等。 用户空间函数原型:int ioctl(int fd,unsinged long cmd,...)   fd-文件描述符 cmd-对设备的发出的控制命令 ...表示这是一个可选的参数,存在与否依赖于cmd,如cmd为修改波特率,那么....就表示波特率的值。
1434 0
|
前端开发 UED
生命周期(Lifecycle):了解应用程序的生命之旅
在现代应用程序开发中,生命周期是一个关键概念,它描述了应用程序或组件的创建、更新和销毁过程。理解生命周期是构建稳健和高性能应用程序的基础。在本博客中,我们将深入研究生命周期的定义、不同类型和如何利用它来管理应用程序的行为。
583 0
|
Java 编译器 关系型数据库
深入理解 Java 中的 final 关键字
final 是 Java 中重要关键字之一,可以应用于类、方法以及变量上。这篇文章中将讲解什么是 final 关键字?将变量、方法和类声明为 final 代表了什么?使用 final 的好处是什么? final 关键字是什么? final 在 Java 中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。
3892 0
|
存储 IDE 编译器
Kotlin | 委托机制 & 原理 & 应用 彭旭锐
Kotlin | 委托机制 & 原理 & 应用 彭旭锐
716 0
Kotlin | 委托机制 & 原理 & 应用  彭旭锐