GCDのシリアルキューとパラレルキュー

4819 ワード

GCDには3つのキュータイプがあります.
  • The main queue:プライマリスレッド機能と同じです.シリアルキューです.
  • Global queues:グローバルキューは同時キューであり、プロセス全体で共有されます.プロセスには、高、中(デフォルト)、低、バックグラウンドの4つのグローバルキューがあります.優先度:
  • #define DISPATCH_QUEUE_PRIORITY_HIGH 2
    #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
    #define DISPATCH_QUEUE_PRIORITY_LOW (-2)
    #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
    
  • ユーザーキュー:ユーザーキューはシリアル作成:
  • //main_queue
    dispatch_queue_t GCDQueue = dispatch_get_main_queue();
    //global_queue
    dispatch_queue_t GCDQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //user_queue
    dispatch_queue_t GCDQueue = dispatch_queue_create("com.test.gcd", NULL);
    

    global_Queueはグローバル同時キュー、すなわちglobal_に参加するQueueのコードブロックはすぐにglobal_で次のコードを実行します.Queueに2つのコードブロックを前後して追加
    -(void)test {
        dispatch_queue_t GCDQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
        dispatch_async(GCDQueue, ^{
                NSLog(@"111111111111");
                NSLog(@"111111111111");
                NSLog(@"111111111111");
                NSLog(@"111111111111");
                NSLog(@"111111111111");
        });
        
        dispatch_async(GCDQueue, ^{
                NSLog(@"22222222222222");
                NSLog(@"22222222222222");
                NSLog(@"22222222222222");
                NSLog(@"22222222222222");
                NSLog(@"22222222222222");
                NSLog(@"22222222222222");
        });
    }
    

    実行結果:
    2014-03-10 22:51:09.498 gcdtest[18010:4207] 22222222222222
    2014-03-10 22:51:09.498 gcdtest[18010:1103] 111111111111
    2014-03-10 22:51:09.501 gcdtest[18010:4207] 22222222222222
    2014-03-10 22:51:09.501 gcdtest[18010:1103] 111111111111
    2014-03-10 22:51:09.501 gcdtest[18010:4207] 22222222222222
    2014-03-10 22:51:09.502 gcdtest[18010:1103] 111111111111
    2014-03-10 22:51:09.502 gcdtest[18010:4207] 22222222222222
    2014-03-10 22:51:09.503 gcdtest[18010:4207] 22222222222222
    2014-03-10 22:51:09.503 gcdtest[18010:1103] 111111111111
    2014-03-10 22:51:09.504 gcdtest[18010:4207] 22222222222222
    2014-03-10 22:51:09.504 gcdtest[18010:1103] 111111111111
    

    2つのコードブロックが同時実行であることがわかります
    user_Queueはユーザーが作成したシリアルキューで、ユーザーがこのキューに参加したコードブロックはキューに参加した時間によって前後して実行され、現在のコードがすぐに実行されてから、次のコードブロックは次のコードを実行します.
    -(void)test{
        dispatch_queue_t userQueue = dispatch_queue_create("com.test.gcd", DISPATCH_QUEUE_SERIAL);    
            dispatch_async(userQueue,^{
                NSLog(@"111111111111");
                NSLog(@"111111111111");
                NSLog(@"111111111111");
            });
    
            dispatch_async(userQueue,^{
                NSLog(@"22222222222222");
                NSLog(@"22222222222222");
                NSLog(@"22222222222222");
                NSLog(@"22222222222222");
            });
    }
    

    実行結果:
    2014-03-10 22:56:55.928 gcdtest[18046:1c03] 111111111111
    2014-03-10 22:56:55.929 gcdtest[18046:1c03] 111111111111
    2014-03-10 22:56:55.929 gcdtest[18046:1c03] 111111111111
    2014-03-10 22:56:55.930 gcdtest[18046:1c03] 22222222222222
    2014-03-10 22:56:55.930 gcdtest[18046:1c03] 22222222222222
    2014-03-10 22:56:55.930 gcdtest[18046:1c03] 22222222222222
    2014-03-10 22:56:55.930 gcdtest[18046:1c03] 22222222222222
    

    同時スレッドでは、ログ1が最初にキューに追加され、実行が完了するとログ2が実行されます.
    さらにログ1に遅延を追加
    -(void)test{
        __block dispatch_queue_t userQueue = dispatch_queue_create("com.test.gcd", NULL);
        
        dispatch_queue_t GCDQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        
        dispatch_async(GCDQueue, ^{
            [NSThread sleepForTimeInterval:2.0f];
            dispatch_async(userQueue,^{
                NSLog(@"111111111111");
                NSLog(@"111111111111");
                NSLog(@"111111111111");
            });
        });
        
        dispatch_async(GCDQueue, ^{
            dispatch_async(userQueue,^{
                NSLog(@"22222222222222");
                NSLog(@"22222222222222");
                NSLog(@"22222222222222");
                NSLog(@"22222222222222");
            });
        });
    }
    

    実行結果:
    2014-03-10 22:58:16.991 gcdtest[18066:1103] 22222222222222
    2014-03-10 22:58:16.992 gcdtest[18066:1103] 22222222222222
    2014-03-10 22:58:16.993 gcdtest[18066:1103] 22222222222222
    2014-03-10 22:58:16.993 gcdtest[18066:1103] 22222222222222
    2014-03-10 22:58:19.066 gcdtest[18066:1903] 111111111111
    2014-03-10 22:58:19.066 gcdtest[18066:1903] 111111111111
    2014-03-10 22:58:19.067 gcdtest[18066:1903] 111111111111
    

    遅延を追加すると、ログ1はログ2より後にキューに追加され、ログ2が実行された後にログ1が実行されます.
    私は1つのQQ群を創建して、みんながインターネットの開放的な心理状態に基づいて、出会った問題と経験を群の中で分かち合って、みんなが互いに心得を交流して、共に向上することを望みます.グループ番号:77311380