【问题标题】:Is there any simple way to improve performance of this spinlock function?有什么简单的方法可以提高这个自旋锁功能的性能吗?
【发布时间】:2012-08-09 00:34:38
【问题描述】:

我正在尝试在我的代码中实现自旋锁,但我基于 Wikipedia 实现的自旋锁导致性能极慢。

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");
}

有什么方法可以改进它以使其更快?

谢谢。

【问题讨论】:

  • 我认为您正在尝试优化错误的东西。如果你有这么多的锁争用,你需要重新考虑你的算法,lock() 之外的代码,看看如何减少所说的争用。或者您可能想选择只旋转几次锁,然后退出并做一些有用的事情(或睡觉)。

标签: c inline-assembly spinlock


【解决方案1】:

这样的事情怎么样(我知道这是 KeAcquireSpinLock 实现)。不幸的是,我的 at&t 程序集很弱。

spin_lock:
    rep; nop
    test lockValue, 1
    jnz spin_lock
    lock bts lockValue
    jc spin_lock
【解决方案2】:
  "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; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    相关资源
    最近更新 更多