GCDシリアルキュー、同時キューとホームキューの整理

4116 ワード


1.シリアルキュー:Dispatch QuesまたはSerial Ques

同期

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
これらの関数は無効です.
しかし、私たちのアプリケーションは簡単な同期ではなく、非同期で実行され、アプリケーションは常に混合されています.
例えばtask 1 task 2 task 3をすべて実行してからtask 4 task 5 task 6を非同期で実行するにはどうすればいいですか?ここで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.