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

来源:互联网 发布:网络播放器哪个最好 编辑:程序博客网 时间:2024/06/06 01:49

同一个blockObject

01SSViewController *firstVC = (SSViewController *)self.window.rootViewController;
02    [firstVC gcdTestMethod:^{
03        for (int i=1; i<5; i++)
04        {
05            NSString *isMain = [[NSThread currentThread] isMainThread]?@"YES":@"NO";
06            NSLog(@"    1 ====% 2d  %@ Main:%@",i,[NSThread currentThread],isMain);
07        }
08    }];
09    [firstVC gcdTestMethod:^{
10        for (int i=1; i<5; i++)
11        {
12            NSString *isMain = [[NSThread currentThread] isMainThread]?@"YES":@"NO";
13            NSLog(@"    2 ====% 2d  %@ Main:%@",i,[NSThread currentThread],isMain);
14        }
15    }];

这里给6个不同实现和不同的结果:

======================== 1 ============================ 
1- (void)gcdTestMethod:(gcdBlockObject)oneGcdObject
2{
3    if (!_concurrentQ){
4        _concurrentQ =
5        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT);
6//        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL);
7    }
8    dispatch_async(_concurrentQ, oneGcdObject);
9}
 

======================== 2 ============================ 
1- (void)gcdTestMethod:(gcdBlockObject)oneGcdObject
2{
3    if (!_concurrentQ){
4        _concurrentQ =
5        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT);
6//        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL);
7    }
8    dispatch_sync(_concurrentQ, oneGcdObject);
9}
 

======================== 3 ============================ 
1- (void)gcdTestMethod:(gcdBlockObject)oneGcdObject
2{
3    if (!_concurrentQ){
4        _concurrentQ =
5//        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT);
6        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL);
7    }
8    dispatch_async(_concurrentQ, oneGcdObject);
9}
 

========================= 4 ===========================
1- (void)gcdTestMethod:(gcdBlockObject)oneGcdObject
2{
3    if (!_concurrentQ){
4        _concurrentQ =
5//        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT);
6        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL);
7    }
8    dispatch_sync(_concurrentQ, oneGcdObject);
9}
 

========================= 5 ===========================
1- (void)gcdTestMethod:(gcdBlockObject)oneGcdObject
2{
3//    if (!_concurrentQ){
4        _concurrentQ =
5        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT);
6//        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL);
7//    }
8    dispatch_sync(_concurrentQ, oneGcdObject);
9}
 

========================= 6 ===========================
1- (void)gcdTestMethod:(gcdBlockObject)oneGcdObject
2{
3//    if (!_concurrentQ){
4        _concurrentQ =
5//        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT);
6        dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL);
7//    }
8    dispatch_async(_concurrentQ, oneGcdObject);
9}
 
====================================================

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。

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

原创粉丝点击