`

【翻译】(25)ANDROID ATOMICS OPERATIONS

 
阅读更多

-----------------

英文文档见android-ndk-r7b的documentation.html

属于Android Native Development Kit (NDK)的一部分

http://developer.android.com/sdk/ndk/index.html

翻译仅个人见解

-----------------

 

ANDROID ATOMICS OPERATIONS

 

Android原子操作

 

The problem:

 

问题:

============

 

If your application native code was generated with a NDK release older than r7b and uses any of the following functions defined in the <sys/atomics.h> header:

 

如果你的应用程序原生代码被一个比r7b旧的NDK发布版生成并且使用以下定义在<sys/atomics.h>头文件中的任意函数:

 

  __atomic_cmpxchg (注:猜测:原子地比较old和_new,如果不相等的话加载_new到ptr)

  __atomic_inc (注:原子地把ptr指向的内容加一)

  __atomic_dec (注:原子地把ptr指向的内容减一)

  __atomic_swap (注:猜测:原子地把_new加载进ptr)

 

(注:摘录自sys/atomics.h:

extern int __atomic_cmpxchg(int old, int _new, volatile int *ptr);

extern int __atomic_swap(int _new, volatile int *ptr);

extern int __atomic_dec(volatile int *ptr);

extern int __atomic_inc(volatile int *ptr);

 

Then the corresponding machine code is not guaranteed to work properly on some multi-core Android ARM-based devices (x86 ones are not affected).

 

那么相应的机器代码不保证在一些多核Android的基于ARM设备上工作正常(x86的设备不受影响)。

 

The solution:

 

解决方案:

=============

 

The <sys/atomics.h> header has been updated in NDK r7b. Simply recompiling your _unmodified_ sources with this version of the NDK should be enough to completely eliminate the problem.

 

<sys/atomics.h>头文件已经在NDK r7b中更新。简单地用这个版本的NDK来重新编译你的“未被修改”的代码应该足够地完全消除该问题。

 

If you can't use NDK r7b or later for some reason, read the section below.

 

如果你因为一些原因不能使用NDK r7b或更新,请阅读以下的章节。

 

More details:

 

更多细节:

=============

 

The main issue is that the implementation of these functions, as provided by the C library, did not provide any associated memory barriers. This is by design, because the platform code that uses them does insert explicit barriers around these operations.

 

主要问题是这些函数的实现,正如C库提供的那样,不提供任何被关联的内存壁垒。这是设计造成的,因为使用它们的平台代码在这些操作的周围插入显式的壁垒。

 

The functions were only exposed through the NDK by mistake, they were not supposed to be used from applications. Any application code that use them without inserting its own barriers may experiment incorrect behaviour, which can result in bugs that are very hard to reproduce and diagnose.

 

这些函数只通过NDK错误地被暴露,它们不被暴露以从应用程序中被使用。任意使用它们但不插入它自己的壁垒的应用程序代码可能试验出不正确的行为,它可以导致非常难重现和诊断的缺陷。

 

Not all multi-core devices are affected though. Certain OEMs enforce a policy where all threads of a single process are forced to run on the same core. In this case, the bug cannot occur, unless you're directly accessing shared memory between two processes.

 

不过不是所有多核设备都被影响。某些OEM(注:Original Equipment Manufacturer,原始设备制造商)实施一种策略,单一进程的所有线程被强制运行在相同的核上。在这种情况下,缺陷不能发生,除非你正在直接地在两个进程之间访问共享内存。

 

The problem is only likely to be seen on devices running Android 3.0 to Android 4.1. The C library implementation in 4.1 has been updated to provide full memory barriers as well. This ensures existing native code keeps working correctly on this platform and future ones, even if they were not recompiled.

 

该问题可能只在运行Android 3.0到Android 4.1的设备上被发现。在4.1中的C库实现也已经被升级以提供完全内存壁垒。这确保现存原生代码保持在这个平台和未来的平台上工作正常,即便它们不被重新编译。

 

We still strongly recommend recompiling your native code to ensure you'll never have to debug this issue (life is short). In the case where this would not be possible (e.g. you're using an older version of the NDK for some reason, or a custom build system / toolchain), we recommend stopping from using these functions entirely. Very fortunately, GCC provides handy intrinsics functions that work with very reasonable performance and always provide a full barrier.

 

我们仍然强烈建议重新编译你的原生代码以确保你将不必调试此问题(人生是短暂的)。在它不可能做到的情况下(例如,你因为一些原因正在使用一个旧版本的NDK,或者一个自定义构建系统/工具链),我们建议完全地禁止使用这些函数。非常幸运地,GCC提供便利的本质函数,它可以用非常合理的性能来工作并且总是提供一个完全的壁垒。

 

  __sync_fetch_and_add         instead of __atomic_inc          __sync_fetch_and_add取代__atomic_inc

  __sync_fetch_and_sub         instead of __atomic_sub          __sync_fetch_and_sub取代__atomic_sub

  __sync_val_compare_and_swap  instead of __atomic_cmpxchg      __sync_val_compare_and_swap取代__atomic_cmpxchg

 

See the content of platforms/android-3/arch-arm/usr/include/sys/atomics.h to see how these can be used.

 

参见platforms/android-3/arch-arm/usr/include/sys/atomics.h的内容以查看它们可以如何被使用。

 

See the following URL for more GCC-related information:

 

参见以下URL以获得更多GCC相关信息:

 

  http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html

 

分享到:
评论

相关推荐

    aarch64-linux-android-ld

    android sdk aarch64-linux-android-ld文件 for ubuntu 16.04

    Atomics:原子操作API

    原子操作(Atomic Operations)是一种在多线程编程中保证操作不可分割的机制。这意味着当一个线程执行原子操作时,其他线程不能中断该操作,直到它完全完成。这样可以确保即使在高并发环境下,数据也能保持一致,...

    cudac-atomics.pdf

    本文档详细介绍了CUDA编程中的一些关键概念和问题,包括竞争条件(race conditions)、原子操作(atomics)、锁(locks)、互斥(mutex)以及 warp。 竞争条件是多线程程序中常见的问题,特别是在并行计算中,如果...

    陶大lesson10atomics.pdf

    标题中提到了“陶大”和“atomics”,这可能指向的是某位名叫陶大的讲师所讲授的课程,课程编号为lesson10,主题涉及“atomics”,即原子操作。 #### 原子操作(Atomics) - 原子操作是指不可被线程调度机制打断的...

    swift-atomics:这个包为Swift实现了一个atomics库,为各种Swift类型提供了atomic操作,包括整数和指针值。 目的是使勇敢的开发人员能够直接在Swift中开始构建同步结构

    这个包为Swift实现了一个atomics库,为各种Swift类型提供了atomic操作,包括整数和指针值。 目的是使勇敢的开发人员能够直接在Swift中开始构建同步结构。 原子操作不受通常的排他性规则约束。 只要所有这些访问都...

    07-06-javascript-atomics

    JavaScript 原子操作(Atomics)是 JavaScript 这种多线程编程环境中的一个重要概念。在现代Web应用中,JavaScript 已经不再局限于单线程执行,而是通过Web Worker等技术支持了多线程处理。然而,多线程环境下数据...

    07-10-ajax-atomics

    "07-10-ajax-atomics" 这个标题可能是某个教程或项目的一部分,其中“ajax”代表Asynchronous JavaScript and XML(异步JavaScript和XML),是Web开发中用于创建动态网页的技术。"atomics"在这里可能表示这些练习是...

    Android代码-java-concurrency-patterns

    Java Concurrency Patterns and Features Concurrency Patterns and features found in Java, through multithreaded programming. Features: ...Atomics Futures FutureTask CompletableFuture Java M

    ajax-atomics

    您将获得: 带有主页的Sinatra应用程序。 / public中有两个文件。 一个名为“INFO1”有yes在它。...问题将这些问题的答案写在home.erb文件中-有点像本周早些时候对JavaScript Atomics所做的那样。 即使

    blex:具有并发可访问性的快速Bloom过滤器,由:atomics模块提供支持

    在Erlang和Elixir编程语言中,`blex`是一个实现并发可访问的快速Bloom过滤器库,其核心特性是利用了`atomics`模块来确保在多线程环境下的数据一致性。 `atomics`模块是Erlang和Elixir中处理原子操作的工具,它提供...

    invoke-atomicredteam:Invoke-AtomicRedTeam是一个PowerShell模块,用于执行[atomics文件夹](https

    “ atomics文件夹”包含定义的每种技术的文件夹。 在每个“ T#”文件夹中,您都会找到一个yaml文件,该文件定义了每个原子测试的攻击过程以及更易于读取的相同数据的markdown( md )版本。 执行原子测试可能会使...

    Atomics:OSAtomic 包中一些原语的漂亮包装器,使用 Foundation 类型

    原子 包中原语的包装器,使用Foundation类型。 AtomicBoolean : BOOL标志的原子包装器 AtomicInteger :带有附加计数器语义( add-and-get 、 get-and-add )的NSInteger原子包装器(32 位或 64 位,取决于它编译的...

    C++标准程序库(侯捷/孟岩译)

    在多线程编程时,合理地使用互斥量(mutexes)和原子操作(atomics)等同步机制,可以保证线程安全。 总之,《C++标准程序库》这本书为C++程序员提供了一个完整的资源来学习和应用C++标准库,而侯捷和孟岩的翻译...

    asfrom30.github.io

    设置和运行环境环境安装rvm 需要Ruby2.7 `$ rvm install 2.71安装依赖$ sh install.sh实时重载$ sh livereload.... 선언다음과이선언: layout: atomics/root전역css삽입하기 모든css,js,图像경project는根/ assets한

    atomic-array-rs:定义几种数组类型,其中元素可以原子更新。 旨在提供类似于Java中的java.util.concurrent.atomic中的原子数组类型

    AtomicI64Array (需要nightly编译器和integer_atomics功能) AtomicU8 ... AtomicU64Array (需要nightly编译器和integer_atomics功能) 用法 [ dependencies ] atomic-array = " 0.3 " 执照 根

    libstdc++-api.pdf

    8. **Atomics**:提供了一系列用于无锁编程的原子操作类型和函数,这些用于同步访问共享内存区域。 9. **Base and Implementation classes**:这些是库的基础类,其他类通常继承自这些基类,实现具体功能。 10. **...

    javascript多线程

    总结来说,JavaScript多线程主要通过Web Workers、Service Workers、SharedArrayBuffer和Atomics等技术实现,旨在提升Web应用的性能和用户体验。在实际开发中,我们需要根据应用场景选择合适的多线程方案,并注意...

    这个包为Swift实现了一个原子库-Swift开发

    这个包为Swift实现了一个atomics库,为各种Swift类型提供了atomic操作,包括整数和指针值。 目的是使勇敢的开发人员能够直接在Swift中开始构建同步结构。 Swift Atomics:atom_symbol:︎︎该软件包为Swift实现了一个...

Global site tag (gtag.js) - Google Analytics