thread pthread spinlock - ceragon/LinuxDoc GitHub Wiki

spinlock

结构体

typedef volatile int pthread_spinlock_t;

lock

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

unlock

int pthread_spin_unlock (pthread_spinlock_t *lock) {
    // 将 lock 的值修改为0
    // release 用于禁止编译器优化,保证 release 之前的修改对所有线程可见
    atomic_store_release (lock, 0);
    return 0;
}
⚠️ **GitHub.com Fallback** ⚠️