iOS个人修养IOSiOS 基础知识

NSRecursiveLock递归锁

2015-12-18  本文已影响1370人  CGPointZero

递归锁,它允许同一线程多次加锁,而不会造成死锁。以下的代码如果用NSLock就会造成死锁:
<code>
//普通线程锁
NSLock *lock = [[NSLock alloc] init];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
static void (^block)(int);
block = ^(int value) {
//加锁
[lock lock];
if (value > 0) {
NSLog(@"%d",value);
sleep(2);
//递归调用
block(--value);
}
//解锁
[lock unlock];
};
//调用代码块
block(10);
});</code>

以上代码,会导致崩溃,出错信息:

<code>*** -[NSLock lock]: deadlock ( '(null)') *** Break on _NSLockError() to debug.</code>

这种情况下,需要改用NSRecursiveLock递归锁。
<code>
//递归锁
NSRecursiveLock *lock = [[NSRecursiveLock alloc] init];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
static void (^block)(int);
block = ^(int value) {
//加锁
[lock lock];
if (value > 0) {
NSLog(@"%d",value);
sleep(2);
//递归调用
block(--value);
}
//解锁
[lock unlock];
};
//调用代码块
block(10);
});</code>

上一篇下一篇

猜你喜欢

热点阅读