2012-08-12 52 views
2

我试图在我的代码中实现自旋锁,但是我基于维基百科实现的自旋锁导致性能极其低下。有没有简单的方法来提高此自旋锁功能的性能?

int lockValue = 0; 

void lock() { 
    __asm__("loop: \n\t" 
      "movl $1, %eax \n\t" 
      "xchg %eax, lockValue \n\t" 
      "test %eax, %eax \n\t" 
      "jnz loop"); 
} 

有没有什么办法可以提高这个速度?

谢谢。

+1

我想你想优化错误的事情。如果你有太多的锁争用,你需要重新考虑你的算法,'lock()'之外的代码,看看你如何减少争用。或者你可能想选择旋转锁定几次,然后退出并做一些有用的事情(或睡眠)。 – 2012-08-12 15:07:05

回答

5

如何这样的事情(我明白这是KeAcquireSpinLock实现)。不幸的是,我在& t组件很脆弱。

spin_lock: 
    rep; nop 
    test lockValue, 1 
    jnz spin_lock 
    lock bts lockValue 
    jc spin_lock 
+2

另请参见:[什么是“rep; nop;”在x86程序集中是什么意思?](http://stackoverflow.com/questions/7086220/what-does-rep-nop-mean-in-x86-assembly)和[x86如何暂停指令在spinlock中工作并且可以使用它在其他情况?](http://stackoverflow.com/questions/4725676/how-does-x86-pause-instruction-work-in-spinlock-and-can-it-be-used-in-other-sc) – nhahtdh 2012-08-12 15:10:07

+2

另请参见:[x86汇编中的“lock”指令的含义是什么?](http://stackoverflow.com/questions/8891067/what-does-the-lock-instruction-mean-in-x86-assembly)和[多核CPU上的x86 LOCK](http://stackoverflow.com/questions/3339141/x86-lock-question-on-multi-core-cpus/3339380#3339380)和[单核/多核CPU的原子操作]核心](http://wiki.osdev.org/Atomic_operation) – nhahtdh 2012-08-12 15:20:23

+0

@nhahtdh嘿,你提供了很好的链接。保持好的东西:-) – cnicutar 2012-08-12 15:20:55

4
"movl $1,%%edx  \n\t" // edx = 1; 
    ".set lockloop,. \n\t" // symbol lockloop set to pc 
    "xorl %%eax,%%eax \n\t" // eax = 0; 
    "lock cmpxchgl %%edx,(%%ebx)\n\t" // if (*mu_ptr == eax) *mu_ptr = edx; 
           // else { eax = *mu_ptr; 
    "jnz  lockloop  \n\t" //   goto lockloop; } 
相关问题