GCD 串行队列,并发队列和主队列的整理

1.串行队列:Dispatch Queues或者 Serial Queues
并发

同步

 

[cpp]  view plaincopy
  1. dispatch_queue_t queue = dispatch_queue_create("zenny_chen_firstQueue", nil);  
  2.       
  3.     dispatch_sync(queue, ^(void) {  
  4.           
  5.           
  6.         sleep(2-i/50);  
  7.         NSLog(@"The sum is: %d", i);  
  8.          
  9.         //flag = YES;  
  10.     });  
  11. dispatch_release(queue);   

 

 

异步

 

[cpp]  view plaincopy
  1. dispatch_queue_t queue = dispatch_queue_create("zenny_chen_firstQueue", nil);  
  2.     dispatch_async(queue, ^(void) {  
  3.         sleep(2-i/50);  
  4.         NSLog(@"The sum is: %d", i);  
  5.           
  6.         // signal the semaphore  
  7.         //dispatch_semaphore_signal(sem);  
  8.     });  
  9. dispatch_release(queue);  

 

当主线程在等待信号量时,操做系统会直接将它挂起,所以不会去死作标志轮询,而可以及时将CPU资源给其它可被调度的线程使用。app

 

[cpp]  view plaincopy
  1. __block dispatch_semaphore_t sem = dispatch_semaphore_create(0);  
  2.     
  3.   dispatch_queue_t queue = dispatch_queue_create("zenny_chen_firstQueue", nil);  
  4.   dispatch_async(queue, ^(void) {  
  5.       sleep(2-i/50);  
  6.       NSLog(@"The sum is: %d", i);  
  7.         
  8.       // signal the semaphore  
  9.       dispatch_semaphore_signal(sem);  
  10.   });  
  11.     
  12.   // wait for the semaphore  
  13.  dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);  
  14.     
  15.  dispatch_release(queue);  


2.并发队列
 :Concurrent Queues
异步

[cpp]  view plaincopy
  1. dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);    
  2. dispatch_queue_t aHQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
    
  3. dispatch_queue_t aLQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);    

 

 

3.主队列:main dispatch Queueasync

[cpp]  view plaincopy
  1. dispatch_queue_t mainQueue = dispatch_get_main_queue();    


针对以上3种队列:concurrent queues和main queue都是由系统生成并且 dispatch_suspend, dispatch_resume, dispatch_set_context这些函数对他们无效。
函数

 

可是咱们的应用不是简单的同步也异步的运行,应用常常是混合的。oop

好比咱们要task1 task2 task3都运行完成后才能异步运行task4 task5 task6咱们该怎么作呢?这里咱们能够引入group的概念。this

 

 

[cpp]  view plaincopy
  1. -(void)sixthMethod{    
  2.     //获取concurrent queue    
  3.     dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);    
  4.     //建立1个queue group    
  5.     dispatch_group_t queueGroup = dispatch_group_create();    
  6.     //任务1    
  7.     dispatch_group_async(queueGroup, aQueue, ^{    
  8.         NSLog(@"task 1.");    
  9.     });    
  10.     //任务2    
  11.     dispatch_group_async(queueGroup, aQueue, ^{    
  12.         NSLog(@"task 2.");    
  13.     });    
  14.     //任务3    
  15.     dispatch_group_async(queueGroup, aQueue, ^{    
  16.         NSLog(@"task 3.");    
  17.     });    
  18.     NSLog(@"wait task 1,2,3.");    
  19.     //等待组内任务所有完成    
  20.     dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER);    
  21.     NSLog(@"task 1,2,3 finished.");    
  22.     //释放组    
  23.     dispatch_release(queueGroup);    
  24.     //从新建立组    
  25.     queueGroup = dispatch_group_create();    
  26.     //任务4    
  27.     dispatch_group_async(queueGroup, aQueue, ^{    
  28.         NSLog(@"task 4.");    
  29.     });    
  30.     //任务5    
  31.     dispatch_group_async(queueGroup, aQueue, ^{    
  32.         NSLog(@"task 5.");    
  33.     });    
  34.     //任务6    
  35.     dispatch_group_async(queueGroup, aQueue, ^{    
  36.         NSLog(@"task 6.");    
  37.     });    
  38.     NSLog(@"wait task 4,5,6.");    
  39.     //等待组内任务所有完成    
  40.     dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER);    
  41.     NSLog(@"task 4,5,6 finished.");    
  42.     //释放组    
  43.     dispatch_release(queueGroup);    
  44. }    

 

 

代码运行结果:
2013-05-13 13:55:33.783 GDC[2466:1303] task 1. 2013-05-13 13:55:33.783 GDC[2466:3a07] task 3. 2013-05-13 13:55:33.783 GDC[2466:c07] wait task 1,2,3. 2013-05-13 13:55:33.783 GDC[2466:1903] task 2. 2013-05-13 13:55:33.787 GDC[2466:c07] task 1,2,3 finished. 2013-05-13 13:55:33.788 GDC[2466:c07] wait task 4,5,6. 2013-05-13 13:55:33.788 GDC[2466:1303] task 4. 2013-05-13 13:55:33.788 GDC[2466:1903] task 5. 2013-05-13 13:55:33.788 GDC[2466:3a07] task 6. 2013-05-13 13:55:33.790 GDC[2466:c07] task 4,5,6 finished.
相关文章
相关标签/搜索