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