GCD

作者: 李波小丑 | 来源:发表于2017-03-02 08:06 被阅读0次

    并发
    很多人同时排队买火车票
    并行
    火车站有5个窗口同时卖票

    dispatch_set_target_queue

    变更生成的Dispatch Queue的执行优先级
    dispatch_set_target_queue(queue1,queue2);
    queue1:指定要变更优先级的queue
    queue2:指定queue1与queue2使用相同优先级
    第一个参数如果指定为系统提供的 Main Dispatch Queue 则不知道会发生什么。因此不可指定。
    如果在多个 Serial Dispatch Queue 中用dispatch_set_target_queue函数指定目标为某一 Serial Dispatch Queue,那么原本应并行执行的多个 Serial Dispatch Queue 同时只能执行一个

    dispatch_after

    3秒后执行

    dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3ull*NSEC_PER_SEC); // 3秒
    //dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3ull*NSEC_PER_MSEC); // 3毫秒
    dispatch_after(time, dispatch_get_main_queue(), ^{
            
    });
    

    Dispatch Group

    dispatch_barrier_async

    dispatch_sync

    dispatch_apply

    按指定的次数将指定的block追加到指定的 Dispatch Queue 中,并等全部处理执行结束。

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_apply(10, queue, ^(size_t index) {
       NSLog(@"%zu",index);
    });
    NSLog(@"done");
    
    0
    2
    1
    4
    5
    6
    7
    8
    9
    3
    done
    

    dispatch_suspend / dispatch_resume

    挂起指定的 Dispatch Queue
    dispatch_suspend(queue);
    恢复指定的 Dispatch Queue
    dispatch_resume(queue);
    这两个方法对已经执行的处理没有影响。挂起后,追加到 Dispatch Queue 中但尚未执行的处理会被挂起,

    Dispatch Semaphore

    Dispatch Semaphore 是持有计数的信号,该计数是多线程编程中的计数类型信号。所谓信号,类似于过马路时常用的手旗,可以通过时举起手旗,不可通过时放下手旗。而在 Dispatch Semaphore中,使用计数来实现该功能。计数为0时等待,计数为1或大于1时,减去1而不等待。

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    /*
     * Dispatch Semaphore 的计数初始值设定为 1
     * 保证访问 NSMutableArray 类对象的线程同时只有一个
     */
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
    NSMutableArray *array = [[NSMutableArray alloc] init];
    for (int i=0; i<10; ++i) {
       dispatch_async(queue, ^{
           /*
            * 等待 Dispatch Semaphore
            * 一直等待,直到 Dispatch Semaphore 的计数值达到大于等于1
            */
           dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
           
           /*
            * 由于semaphore的初始值为1,达到dispatch_semaphore_wait的执行条件
            * 将semaphore的计数减一  semaphore计数=0
            */
           [array addObject:[NSNumber numberWithInt:i]];
           
           /*
            * 排他控制处理结束
            * 将semaphore计数加一  semaphore计数=1
            * 达到dispatch_semaphore_wait的执行条件
            * 由最先等待的线程执行
            */
           dispatch_semaphore_signal(semaphore);
       });
    }
    

    相关文章

      网友评论

          本文标题:GCD

          本文链接:https://www.haomeiwen.com/subject/yqkhgttx.html