GCD学習(一)


IOSがマルチスレッドを使用するには、NSThread、NSOperation、NSOperationQueue、GCDの3つの方法がある.
GCD学習(一)
(1)非同期と同期
dispatch_sync(queue, ^{
            NSLog(@"      ");
        });
        
        dispatch_async(queue, ^{
            NSLog(@"      ");
        });

(2)パラレルキューとシリアルキュー
//    
    //dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//         
    dispatch_queue_t concurrentQuueue = dispatch_queue_create("com.itt.crq", DISPATCH_QUEUE_CONCURRENT);//       
    dispatch_async(concurrentQuueue, ^{
        
        NSLog(@"task1");
    });
    dispatch_async(concurrentQuueue, ^{
        
        NSLog(@"task2");
    });
    
    
    //    
    dispatch_queue_t serialQueue = dispatch_queue_create("con.itt.srq", DISPATCH_QUEUE_SERIAL);
    dispatch_async(serialQueue, ^{
        
        NSLog(@"task1");
    });
    dispatch_async(serialQueue, ^{
        
        NSLog(@"task2");
    });

(3)タスクグループ
dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_async(group, myQueue, ^{

        NSLog(@"task1");
    });
    dispatch_group_async(group, myQueue, ^{
        
        NSLog(@"task1");
    });
    dispatch_group_async(group, myQueue, ^{
        
        NSLog(@"task3");
    });
    
    NSLog(@"wait 1 2 3");
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    NSLog(@"task 1 2 3 finished");

(4)プロセス同期を実現するためにdispatch_group_enter、dispatch_group_leave、dispatch_group_wait
//dispatch_group_enter dispatch_group_leave      
    dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_enter(group);
    
    dispatch_group_async(group, myQueue, ^{
        
        NSLog(@"again");
        
        sleep(5);
        
        dispatch_group_leave(group);
    });
    
    
    dispatch_group_enter(group);
    
    dispatch_group_async(group, myQueue, ^{
        
        NSLog(@"next");
        
        sleep(10);
        
        dispatch_group_leave(group);
    });
    
    NSLog(@"start");
    NSLog(@"waiting");
    
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);//dispatch_group_wait           
    
    NSLog(@"finish");

(5)信号量(制御同時)
   :

dispatch_group_t group = dispatch_group_create();
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(10);
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    for (int i = 0; i < 100; i++)
    {
        
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_group_async(group, queue, ^{
            NSLog(@"%i",i);
            
            sleep(2);
            dispatch_semaphore_signal(semaphore);
        });
    }
    
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    
    
    :
 
 
 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    dispatch_async(queue, ^{
    
        
        
        NSLog(@"waiting create data");
        
        sleep(5);
        
        NSLog(@"create data complete");
        
        dispatch_semaphore_signal(semaphore);
    });
    
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    dispatch_async(queue, ^{
        
        
        
        NSLog(@"haha~,I am get data complete");
        
    });

インスタンス1プログラムの実行では、まず10個の新しいスレッドが作成され、その後、スレッドの実行が終了するたびにスレッドが作成されます.インスタンス2 5秒後に「haha~,I am get data complete」を出力します.