GCD 串列隊列,並發隊列和主隊列的整理

來源:互聯網
上載者:User

 

1.串列隊列:Dispatch Queues或者 Serial Queues

同步

dispatch_queue_t queue = dispatch_queue_create("zenny_chen_firstQueue", nil);        dispatch_sync(queue, ^(void) {                        sleep(2-i/50);        NSLog(@"The sum is: %d", i);               //flag = YES;    });dispatch_release(queue); 

非同步

 

dispatch_queue_t queue = dispatch_queue_create("zenny_chen_firstQueue", nil);    dispatch_async(queue, ^(void) {        sleep(2-i/50);        NSLog(@"The sum is: %d", i);                // signal the semaphore        //dispatch_semaphore_signal(sem);    });dispatch_release(queue);

當主線程在等待訊號量時,作業系統會直接將它掛起,因此不會去死做標誌輪詢,而能夠及時將CPU資源給其它可被調度的線程使用。

  __block dispatch_semaphore_t sem = dispatch_semaphore_create(0);        dispatch_queue_t queue = dispatch_queue_create("zenny_chen_firstQueue", nil);    dispatch_async(queue, ^(void) {        sleep(2-i/50);        NSLog(@"The sum is: %d", i);                // signal the semaphore        dispatch_semaphore_signal(sem);    });        // wait for the semaphore   dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);       dispatch_release(queue);


2.並發隊列
:Concurrent Queues

    dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);      dispatch_queue_t aHQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
      dispatch_queue_t aLQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);  

3.主隊列:main dispatch Queue

dispatch_queue_t mainQueue = dispatch_get_main_queue();  

針對以上3種隊列:concurrent queues和main queue都是由系統產生而且 dispatch_suspend, dispatch_resume, dispatch_set_context這些函數對他們無效。

但是我們的應用不是簡單的同步也非同步運行,應用經常是混合的。

比如我們要task1 task2 task3都運行完成後才能非同步運行task4 task5 task6我們該怎麼做呢?這裡我們可以引入group的概念。

-(void)sixthMethod{      //擷取concurrent queue      dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);      //建立1個queue group      dispatch_group_t queueGroup = dispatch_group_create();      //任務1      dispatch_group_async(queueGroup, aQueue, ^{          NSLog(@"task 1.");      });      //任務2      dispatch_group_async(queueGroup, aQueue, ^{          NSLog(@"task 2.");      });      //任務3      dispatch_group_async(queueGroup, aQueue, ^{          NSLog(@"task 3.");      });      NSLog(@"wait task 1,2,3.");      //等待組內任務全部完成      dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER);      NSLog(@"task 1,2,3 finished.");      //釋放組      dispatch_release(queueGroup);      //重新建立組      queueGroup = dispatch_group_create();      //任務4      dispatch_group_async(queueGroup, aQueue, ^{          NSLog(@"task 4.");      });      //任務5      dispatch_group_async(queueGroup, aQueue, ^{          NSLog(@"task 5.");      });      //任務6      dispatch_group_async(queueGroup, aQueue, ^{          NSLog(@"task 6.");      });      NSLog(@"wait task 4,5,6.");      //等待組內任務全部完成      dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER);      NSLog(@"task 4,5,6 finished.");      //釋放組      dispatch_release(queueGroup);  }  

代碼運行結果:

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.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.