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

これを改善して高速化する方法はありますか?

ありがとう。

4

2 に答える 2

5

このようなものはどうですか (これが KeAcquireSpinLock の実装であることは理解しています)。私の at&t アセンブリは残念ながら弱いです。

spin_lock:
    rep; nop
    test lockValue, 1
    jnz spin_lock
    lock bts lockValue
    jc spin_lock
于 2012-08-12T15:05:24.607 に答える
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; }
于 2012-11-01T20:48:57.087 に答える