typedef volatile int pthread_spinlock_t;
int pthread_spin_lock (pthread_spinlock_t *lock) {
int val = 0;
// 把 lock 的值变为 1,并返回旧值
// 旧值为0,说明加锁成功
if (__glibc_likely (atomic_exchange_acquire (lock, 1) == 0)) {
return 0;
}
do {
do {
// atomic_spin_nop ();
__asm ("pause");
// 用效率最高的方式获取 lock 的值
val = atomic_load_relaxed (lock);
} while(val != 0);
// 走到这里说明 val 为 0 了
// 比较并交换,也就是尝试将 lock 的值变为 1
} while(!atomic_compare_exchange_weak_acquire (lock, &val, 1));
return 0;
}
int pthread_spin_unlock (pthread_spinlock_t *lock) {
// 将 lock 的值修改为0
// release 用于禁止编译器优化,保证 release 之前的修改对所有线程可见
atomic_store_release (lock, 0);
return 0;
}