Compare and Swap 指令
您可以使用 "机器接口" (MI) 的 "比较和交换" (CMPSWP) 指令来访问多线程程序中的数据。
CMPSWP 指令将第一个比较操作数的值与第二个比较操作数的值进行比较。 如果两个值相等,那么交换操作数将存储在第二个比较操作数的位置。 如果两个值不相等,那么第二个比较操作数将存储到第一个比较操作数的位置。
当进行相等的比较时, CMPSWP 指令确保在第二个比较操作数被访存以进行比较的时刻与交换操作数被存储在第二个比较操作数的位置的时刻之间,不会在第二个比较操作数的位置发生另一个 CMPSWP 指令的访问。
当发生不相等的比较时,不会对存储对第一个比较操作数位置和其他 CMPSWP 指令访问进行原子性保证。 因此,只有第二个比较操作数应该是用于并发处理控制的共享变量。
以下 C 宏的代码示例可用于以原子方式递增或递减整数变量。
#ifndef __cmpswp_h
#include <mih/cmpswp.h>
#endif
#define ATOMICADD ( var, val, rc ) { \
int aatemp1 = (var); \
int aatemp2 = aatemp1 + val; \
while( ! _CMPSWP( &aatemp1, &var, aatemp2 ) ) \
aatemp2 = aatemp1 + val; \
rc = aatemp2; \
}在代码示例中, var 是要递增或递减的整数, val 是要从 var中添加或减去的整数值, rc 是生成的值。