【发布时间】: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