0

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

如何保证 64 位写入是原子的?

.. 但在我走这条路之前,如果有的话,我更愿意使用 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?:)

谢谢!

4

1 回答 1

4

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

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

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

于 2013-01-02T19:51:48.160 回答