交换指令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);
}
实现结果如下,速度较慢