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

同一个blockObject

01 SSViewController *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 }
6个结果搞懂 GCD中 QUEUE 和 async/sync_第1张图片  

========================= 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 }
6个结果搞懂 GCD中 QUEUE 和 async/sync_第2张图片  

========================= 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 }
6个结果搞懂 GCD中 QUEUE 和 async/sync_第3张图片  
====================================================

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."

你可能感兴趣的:(6个结果搞懂 GCD中 QUEUE 和 async/sync)