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.
相關文章
相關標籤/搜索