利用xchg实现自旋锁

819 阅读1分钟

image.png 交换指令XCHG是两个寄存器,寄存器和内存变量之间内容的交换指令。

我们实现的atomic_xchg(x, y),则是返回x的值,之后将y值赋值给x,且是原子操作。

代码如下:

#include <threads.h>

typedef struct spinlock {
  intptr_t locked;
} spinlock_t;

void spin_init(spinlock_t *lk) {
  lk->locked = 0;
}

void spin_lock(spinlock_t *lk) {
  while (atomic_xchg(&lk->locked, 1)) ;
}

void spin_unlock(spinlock_t *lk) {
  atomic_xchg(&lk->locked, 0);
}

spinlock_t lk;

long volatile sum = 0;

void do_sum() {
  for (int i = 0; i < 10000000; i++) {
    spin_lock(&lk);
    sum++;
    spin_unlock(&lk);
  }
}

void print() {
  printf("sum = %ld\n", sum);
}

int main() {
  spin_init(&lk);
  for (int i = 0; i < 4; i++) {
    create(do_sum);
  }
  join(print);
}

实现结果如下,速度较慢

image.png