iOS 不安全的OSSpinLock锁
OSSpinLock
OSSpinLock 是自旋锁,等待锁的线程会处于忙等状态,一直占用着 CPU
// 初始化自旋锁
OSSpinLock lock = OS_SPINLOCK_INIT;
// 加锁
OSSpinLockLock(&lock);
// 解锁
OSSpinLockUnlock(&lock);
当多线程访问的时候,一个线程进行了加锁 OSSpinLockLock ,另一个线程走到这里的时候,发现被别的线程加锁了,那么这个线程就会在这里等待,当别的线程释放锁的时候,这个线程发现了,就会加上锁,然后继续执行,让别的线程去等待。
自旋锁就好比写了个 while,whil(被加锁了) ; 不断的忙等,重复这样。
有一个问题是,比如我们有线程1和线程2,如果线程的优先级比较高,那么分配给这个线程的时间就比较多,我们的自旋锁就会发生优先级反转的问题,比如优先级比较低的线程2先进去,那么线程2先加锁了,紧接着线程1进来了,发现已经被加锁了,那么线程1忙等,while(未解锁); 不断的等待,由于线程1的优先级比较高,CPU就一直分配之间给线程1,就没有时间分配给线程2,就有可能导致线程2的代码就没有办法往下走,就会造成线程2没有办法解锁,所以这个锁就不安全了。
网友评论