【问题标题】:android NDK: 64 bit atomics (ARM)安卓 NDK:64 位原子(ARM)
【发布时间】:2012-12-13 01:31:51
【问题描述】:

网上有一些关于如何编写64位原子代码的资料,例如:

How to guarantee 64-bit writes are atomic?

.. 但在我走这条路之前,我更愿意使用 Android NDK / ARM 特定的解决方案(如果有的话)。

我正在移植一个需要 32 位和 64 位原子操作的 C++ 引擎。我研究并实现了 GCC 内置的 __sync_* 函数,但是当需要链接时,我遇到了 64 位操作的这些错误:

error: undefined reference to '__sync_fetch_and_or_8'
error: undefined reference to '__sync_lock_test_and_set_8'
error: undefined reference to '__sync_fetch_and_and_8'
error: undefined reference to '__sync_fetch_and_add_8'
error: undefined reference to '__sync_val_compare_and_swap_8'

我的目标是 armeabi-v7a,我读过它有一些 64 位原子 (ldrexd/strexd) 的汇编指令,那么有没有办法通过 GCC 内置原子访问它们?如果没有,还有哪些其他选择?

  • 使用互斥锁保护每个 64 位操作
  • 编写汇编代码以利用 ldrexd/strexd
  • 将超级机密标志传递给 NDK 工具链以启用 64 位内部函数?
  • 等待 ARMv8? :)

谢谢!

【问题讨论】:

  • 你是直接用__sync_fetch_and_or_8还是__sync_fetch_and_or?您是否阅读过 $android-ndk-r8c/docs/ANDROID-ATOMICS.html 和 gcc.gnu.org/onlinedocs/gcc/…

标签: android android-ndk 64-bit arm atomic


【解决方案1】:

由于我的问题,NDK r8d 已发布,它支持内置的 64 位原子。

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

将 ARM 的 64 位内置原子函数向后移植到 GCC 4.6。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多