2012-08-12 67 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; } 
相關問題