OSSpinLock
自旋锁:等待锁的线程会处于忙等(busy-waite)状态,一直占用CPU资源。
问题:如果等待锁的优先级较高,优先级较低的会一直无法释放
OSSpinLock lock = OS_SPINLOCK_INIT;
bool result = OSSpinLockTry(&lock);
// 加锁
OSSpinLockLock(&_lock);
// 解锁
OSSpinLockUnlock(&_lock);
os_unfair_lock
os_unfair_lock lock = OS_UNFAIR_LOCK_INIT
os_unfair_lock_lock(&_moenyLock);
os_unfair_lock_unlock(&_moenyLock);
mutex
互斥锁:等待锁的线程会处于休眠状态
// 初始化锁属性
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_setcanceltype(&attr, PTHREAD_MUTEX_DEFAULT);
// 初始化锁
pthread_mutex_init(&mutex, &attr);
// 加锁
pthread_mutex_lock(&_tickMutex);
// 解锁
pthread_mutex_unlock(&_moneyMutex);
SemaphoreDemo 信号量
dispatch_semaphore_t semaphore = dispatch_semaphore_create(value);
// 信号量的值>0 就让信号量的值-1 然后继续执行代码
dispatch_semaphore_wait(_semaphore, DISPATCH_TIME_FOREVER);
// 让信号量的值加1
dispatch_semaphore_signal(_semaphore);
性能排列 9DAF296C-8F62-4F53-B226-406BE82C9731.png
自旋锁 互斥锁比较
什么情况下使用自旋锁比较划算
1.预计线程等待时间短
2.加锁的代码(临界区)经常调用。但竞争情况很少发生
3.CPU不紧张
4.多核处理器
什么情况下使用互斥锁
1.预计线程等待锁的时间长
2.单核处理器
3.临界区有IO操作
4.临界代码复杂,循环量大
5.临界代码竞争激烈
网友评论