内联汇编,使用cmpxchg x86的自旋锁(amd 64)

时间:2015-04-05 12:32:54

标签: c assembly

这是我在这里的第一个问题。 我正在使用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。

0 个答案:

没有答案