android NDK:64位原子(ARM)

时间:2012-12-13 01:31:51

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

网上有一些关于如何编写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? :)

谢谢!

1 个答案:

答案 0 :(得分:4)

自从我的问题以来,发布了NDK r8d,它支持内置的64位原子。

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

  

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