sunhongyue4500
3/9/2017 - 10:17 AM

TestQueueSpecific.m

- (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];
}