我正在开发C/C++跨平台代码,最后一个平台是基于Itanium的HP.相关的机器、处理器的信息可以在问题的末尾找到。
我需要为下面给出的机器和编译器规范实现或找到一个原子比较和交换。
我已经找到了一些解决方案的可能性,但一直未能找到如何使用它们。
第一个可能的解决方案是通过使用_Asm_cmpxchg (这里的文件)。我无法找到为此包含哪些标题,也无法找到如何将其编译。
第二个可能的解决方案是直接使用cmpxchg和cmpxchg8b命令编写我自己的内联程序集,但我也无法找到如何正确地这样做。我已经找到了各种资源,其中大多数都是直接编写程序集,而不是针对我所需的处理器体系结构,或者没有给出足够具体的示例。
我找到了更多关于cmpxchg和cmpxchg8指令的文档(以及tzcnt和lzcnt,这是两个很好但不是必要的) 这里。如果您在google中查看,cmpxchg的上述页面值为234,cmpxchg8为236。
限制:由于超出我的控制范围,无法使用第三方库。
结果-smr: HP-UXB.11.31 ia64
处理器模型: Intel(R) Itanium(R)处理器9340
编译器-v: aCC: HP C/aC++ B3910B A.06.28
更新:I能够让_Asm_cmpxchg编译,但它似乎不起作用(值保持不变)。对于参数,我为_Asm_sz传递了_Asm_sz,为_Asm_sem传递了_SEM_ACQ,为_Asm_ldhint传递了_LDHINT_NONE,为r3传递了指向原始32位整数值的指针,为r2传递了所需的新值。我猜测参数的意义,因为文档是非常乏味的。
发布于 2015-08-20 20:39:59
最后,我自己找到了解决方案,使用了选项1。下面是让它工作的示例代码:
bool compare_and_swap(unsigned int* var, unsigned int oldval, unsigned int newval)
{
// Move the old value into register _AREG_CCV because this is the register
// that var will be compared against
_Asm_mov_to_ar(_AREG_CCV, oldval);
// Do the compare and swap
return oldval == _Asm_cmpxchg(
_SZ_W /* 4 byte word */,
_SEM_ACQ /* acquire the semaphore */,
var,
newval,
_LDHINT_NONE /* locality hint */);
}https://stackoverflow.com/questions/32108320
复制相似问题