这是我在这里的第一个问题。 我正在使用cmpxchg指令实现自旋锁。 cmpxchg指令后没有锁定更改。 在那,我的汇编代码有问题。
这是我的线程功能代码。
void *t_function(void *data){
volatile int* t_cnt;
t_cnt = (int *)data;
/* Lock */
while(CompareAndSet(&lock, 0, 1));
/* Critical Section */
for(; i<TEST_NUM; i++){
(*t_cnt)++;
}
/* Unlock */
lock = 0;
}
这是我的CompareAndSet函数,带有内联汇编代码。
unsigned int CompareAndSet(unsigned in *target, unsigned int expected, unsigned int update){
unsigned int rv = *target;
printf("lock : %d, expected : %d, update : %d\n", *target, expected, update);
__asm__ __volatile__(
"cmpxchg %0, %2\n\t"
:"+r" (*target), "+a" (expected)
:"r" (update)
);
printf("lock_after : %d\n", *target);
return rv;
}
当我编译并运行它时,我得到了这个。 锁似乎没有改变。
... lock:0,expected:0,update:1 lock_after:0 Thread [19] 创建。锁定:0,预期:0,更新:1 lock_after:0线程[20] 创建。 lock:0,expected:0,update:1 lock_after:0 lock:0, 预期:0,更新:1 lock_after:0线程[21]创建。线 [22]创建。 lock:0,expected:0,update:1 lock_after:0 Thread [23]创造了。 lock:0,expected:0,update:1 lock_after:0 Thread [24]创建。 lock:0,expected:0,update:1 lock_after:0 Thread [25]创造了。 lock:0,expected:0,update:1 lock_after:0 Thread [26]创建。线程[27]创建。线程[28]创建。锁:0, expected:0,update:1 lock_after:0创建线程[29]。锁:0, 预期:0,更新:1 lock_after:0创建线程[30]。锁:0, 预期:0,更新:1 lock_after:0创建线程[31]。锁:0, 预期:0,更新:1 lock_after:0锁定:0,预期:0,更新 :1 lock_after:0 lock:0,expected:0,update:1 lock_after:0 cnt:9478079
#define THREAD_NUM 32
#define TEST_NUM 10000000
有没有人对我的汇编代码有所了解?
从'AMD64架构程序员手册第3卷:通用和系统指令PDF',我得到了如何使用cmpxchg指令。 它说,
助记符:
CMPXCHG reg / mem32,reg32
操作码: OF B1 / r
描述: 将EAX寄存器与32位寄存器或存储单元进行比较。如果相等,则将第二个操作数复制到第一个操作数。否则,将第一个操作数复制到EAX。