6个结果搞懂 GCD中 QUEUE 和 async/sync

同一个blockObject async

SSViewController *firstVC = (SSViewController *)self.window.rootViewController;
    [firstVC gcdTestMethod:^{
        for (int i=1; i<5; i++)
        {
            NSString *isMain = [[NSThread currentThread] isMainThread]?@"YES":@"NO";
            NSLog(@"    1 ====% 2d  %@ Main:%@",i,[NSThread currentThread],isMain);
        }
    }];
    [firstVC gcdTestMethod:^{
        for (int i=1; i<5; i++)
        {
            NSString *isMain = [[NSThread currentThread] isMainThread]?@"YES":@"NO";
            NSLog(@"    2 ====% 2d  %@ Main:%@",i,[NSThread currentThread],isMain);
        }
    }];

这里给6个不一样实现和不一样的结果: this

======================== 1 ============================
- (void)gcdTestMethod:(gcdBlockObject)oneGcdObject
{
    if (!_concurrentQ){
        _concurrentQ =
        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT);
//        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL);
    }
    dispatch_async(_concurrentQ, oneGcdObject);
}


======================== 2 ============================
- (void)gcdTestMethod:(gcdBlockObject)oneGcdObject
{
    if (!_concurrentQ){
        _concurrentQ =
        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT);
//        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL);
    }
    dispatch_sync(_concurrentQ, oneGcdObject);
}


======================== 3 ============================
- (void)gcdTestMethod:(gcdBlockObject)oneGcdObject
{
    if (!_concurrentQ){
        _concurrentQ =
//        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT);
        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL);
    }
    dispatch_async(_concurrentQ, oneGcdObject);
}


========================= 4 ===========================
- (void)gcdTestMethod:(gcdBlockObject)oneGcdObject
{
    if (!_concurrentQ){
        _concurrentQ =
//        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT);
        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL);
    }
    dispatch_sync(_concurrentQ, oneGcdObject);
}


========================= 5 ===========================
- (void)gcdTestMethod:(gcdBlockObject)oneGcdObject
{
//    if (!_concurrentQ){
        _concurrentQ =
        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT);
//        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL);
//    }
    dispatch_sync(_concurrentQ, oneGcdObject);
}


========================= 6 ===========================
- (void)gcdTestMethod:(gcdBlockObject)oneGcdObject
{
//    if (!_concurrentQ){
        _concurrentQ =
//        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT);
        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL);
//    }
    dispatch_async(_concurrentQ, oneGcdObject);
}

====================================================

1和2对比: DISPATCH_QUEUE_CONCURRENT 的queue 在使用sync时优先使用主线程(当前线程)
3和4对比: DISPATCH_QUEUE_SERIAL 的queue 不管使用sync仍是aync都将遵循FIFO,但使用sync时优先使用主线程(当前线程)
5和6对比: DISPATCH_QUEUE_CONCURRENT 看似建立不一样的queue 但因为都是使用sync,实际上都交给了主线程(当前线程),但不是同一个queue;而DISPATCH_QUEUE_SERIAL 看似没有遵循FIFO,实际是彻底在两个不一样的线程中执行的,这是因为的确建立了两个不一样的queue。
spa

Reference about dispatch_sync in "Grand Central Dispatch (GCD) Reference"
"As an optimization, this function invokes the block on the current thread when possible." 线程

相关文章
相关标签/搜索