琐事
各种锁
OSSpinLock
OSSpinLock是一种自旋锁,性能最好
具体来说,如果一个低优先级的线程获得锁并访问共享资源,这时一个高优先级的线程也尝试获得这个锁,它会处于 spin lock 的忙等状态从而占用大量 CPU。此时低优先级线程无法与高优先级线程争夺 CPU 时间,从而导致任务迟迟完不成、无法释放 lock。这并不只是理论上的问题,libobjc 已经遇到了很多次这个问题了,于是苹果的工程师停用了 OSSpinLock。》优先级反转
建议使用dispatch_semaphore
os_unfair_lock
是一个互斥锁,使用方式和自旋锁类似
//初始化
os_unfair_lock oslock = OS_UNFAIR_LOCK_INIT;
//获取锁,等待解锁后继续执行
os_unfair_lock_lock(&oslock);
//尝试获得锁,不等待继续往下执行
os_unfair_lock_trylock(&oslock);
//解锁
os_unfair_lock_unlock(&oslock);信号量
dispatch_semaphore_create
dispatch_semaphore_wait
等待信号量 信号量
>=1时,计数减1,继续往下执行 信号量=0时,线程在超时时间内等待,到期后继续向下执行 成功返回0,等待超时返回非0
dispatch_semaphore_signal
增加一个信号量,如果之前的信号量小于0,则此函数返回之前唤醒等待的线程
当返回0时:表示无线程等待,信号加1。当返回非0时:表示当前有一个或多个线程线程等待,并且该函数唤醒了一个“等待的线程”(当线程有优先级时,唤醒优先级最高的线程;否则随机唤醒)。
pthread_mutex
C语言实现的互斥锁
@synchronized
使用的是递归互斥锁
NSLock
NSLock通过实现NSLocking协议实现了一种简单的互斥锁,面向对象
举个卖iPhone的例子
加锁
不加锁:结果不确定
NSCondition
NSCondition 的对象实际上作为一个锁和一个线程检查器:锁主要为了当检测条件时保护数据源,执行条件引发的任务;线程检查器主要是根据条件决定是否继续运行线程,即线程是否被阻塞。
NSConditionLock 条件锁
在指定条件时可获得锁
解锁指定条件
NSRecursiveLock 递归锁
NSRecursiveLock实际上定义的是一个递归锁,这个锁可以被同一线程多次请求,而不会引起死锁。这主要是用在循环或递归操作中。它可以允许同一线程多次加锁,而不会造成死锁。递归锁会跟踪它被lock的次数。每次成功的lock都必须平衡调用unlock操作。只有所有达到这种平衡,锁最后才能被释放,以供其它线程使用。
Last updated
Was this helpful?