在IOS中如果涉及到多线程处理则一个需要考虑的问题就是同步问题,如何处理对关键资源的访问是重点,为此IOS提供了NSLock、
NSConditionLock
NSRecursiveLock、 NSCondition 四个类来进行同步处理,他们分别是不可重入锁,条件锁,可重入锁,以及信号条件
-
(BOOL)lockBeforeDate:(NSDate*)limit
在超时前看是否能得到某个锁,如果没有得到则返回no,得到了就返回yes,注意这里如果得到了,就需要调用unlock释放。
NSConditionLock是带条件的锁。也就是只有满足了条件才会锁定否则进入阻塞状态。
-
(id)initWithCondition:(NSInteger)condition; //初始条件。
-(void)lockWhenCondition:(NSInteger)condition; //只在满足条件下才会进入锁。
-(BOOL)tryLock;
-(BOOL)tryLockWhenCondition:(NSInteger)condition;
-(void)unlockWithCondition:(NSInteger)condition; //释放当前的锁,并重新设置锁条件,这个函数是关键!!!
这里如果是调用lock和unlock都是用于满足当前条件以及不会重新设置条件。
NSCondition条件对象是锁和条件的结合,用于进行线程之间的调度通知。
-
(void)wait
使当前线程进入等待状态,知道另外一个线程调用了signal或者broadcast函数来通知等待的线程,注意wait内部会首先调用unlock函数,这也就意味着调用wait函数之前必需要调用lock函数,
这样的目的是为了保证在wait之前的条件判断是原子的。
同时如果是wait函数收到了信号后内部右会调用lock函数进行锁定,所以wait函数用完后一定要调用unlock解锁,
这个过程是调用wait之前和之后需要调用lock,和unlock进行操作,以便保证wait之前和之后的操作都是原子的。
一般为了防止条件竞争在使用signal,broadcast之前后都使用lock和unlock操作。