- (void)testQueueSpecific {
dispatch_queue_t queueA = dispatch_queue_create("com.hongyi", NULL);
dispatch_queue_t queueB = dispatch_queue_create("com.hongyiB", NULL);
// 设置B的target为A
dispatch_set_target_queue(queueB, queueA);
// 标记队列
static int specificKey;
CFStringRef specificValue = CFSTR("queueA");
dispatch_queue_set_specific(queueA,
&specificKey,
(void*)specificValue,
(dispatch_function_t)CFRelease);
dispatch_sync(queueB, ^{
dispatch_block_t block = ^{
NSLog(@"%@", @"hello");
};
CFStringRef retrievedValue = dispatch_get_specific(&specificKey);
if (retrievedValue) {
block();
} else {
dispatch_sync(queueA, block);
}
});
}
- (void)testRecursiveLock {
dispatch_queue_t queueA = dispatch_queue_create("com.hongyi", NULL);
dispatch_block_t block = ^{
NSLog(@"%@", @"world");
};
dispatch_sync(queueA, ^{
dispatch_reentrant(block);
});
}
void dispatch_reentrant(void (^block)())
{
// 多次重入不会造成死锁???
static NSRecursiveLock *lock = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
lock = [[NSRecursiveLock alloc] init];
});
[lock lock];
block();
[lock unlock];
}