NSRecursiveLock递归锁

递归锁,它允许同一线程多次加锁,而不会造成死锁。以下的代码如果用NSLock就会造成死锁:

//普通线程锁
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);
});

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

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

这种情况下,需要改用NSRecursiveLock递归锁。

//递归锁
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);
});

NSRecursiveLock递归锁_第1张图片

你可能感兴趣的:(NSRecursiveLock递归锁)