zoukankan      html  css  js  c++  java
  • GCD API 总结(原创)

    Dispatch Queue即 执行处理的等待队列。

    存在两种Dispatch Queue,即

    Serial Dispatch Queue 等待现在的处理(串行队列)

    Concurrent Dispatch Queue 不等待现在的处理(并发队列)并行处理的数量取决于当前系统的状态,不能像operationQueue一样设置最大数量。

    1.dispatch_queue_create("com.gcd.test",Null)

    创建Dispatch queue,都是Default Priority

    DISPATCH_QUEUE_SERIAL

    DISPATCH_QUEUE_CONCURRENT

    - (void)tsGCD

    {

        dispatch_queue_t queue = dispatch_queue_create("com.gcd.test", DISPATCH_QUEUE_CONCURRENT);

        NSMutableArray *array = [[NSMutableArray alloc]init];

        for (int i = 0; i < 100000; i++) {

            dispatch_async(queue, ^{

                [array addObject:[NSNumber numberWithInt:i]];

            });

        }

        NSLog(@"done");

    }

     

    当为DISPATCH_QUEUE_CONCURRENT,数组AddObject非线程安全,同时访问容易引起问题,

    gcdTest(2484,0x11395b000) malloc: *** error for object 0x7f9c8b802e00: pointer being freed was not allocated

    *** set a breakpoint in malloc_error_break to debug

    当为DISPATCH_QUEUE_SERIAL时,线程有序进行,不会引起并发问题。

     

    系统提供两种快速获取的Dispatch Queue,

    Main Dispatch Queue (主线程,是 Serial Dispatch Queue)

    Global Dispatch Queue (Concurrent Dispatch Queue)

    Global Dispatch Queue 提供4个执行优先级,HIGH DEFAULT LOW BACKGROUND

    2.dispatch_get_main_queue();

    3.dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);

     

    4.dispatch_set_target_queue(destinqueue,fromqueue);

    1.改变dispatch queue 执行优先级

    2.多个Serial Dispatch Queue 防止并行执行,实现Dispatch Queue 的执行阶层。

     

    5.dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW,3ull*NSEC_PER_SEC);

    dispatch_after(time,queue);

    并不是在指定时间后执行处理,而只是在指定时间追加处理到Dispatch queue

    6.dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group,queue,^{NSLog(@"blk0");});

    dispatch_group_notify(group,dispatch_get_main_queue(),^{NSLog(@"done");});

    dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW,3ull*NSEC_PER_SEC);

    dispatch_group_wait(group,time);可以通过返回值判断指定时间后group是否结束。

    追加到Dispatch Queue 中的多个处理全部结束后想执行结束处理。

     

    7.dispatch_barrier_async

    dispatch_barrier_sync

    障碍

    8.dispatch_sync(queue,block)

    dispatch_async(queue,block)

    执行queue

  • 相关阅读:
    Python在函数中使用*和**接收元组和列表
    nvidia-smi实时刷新并高亮显示状态
    linux docker
    linux Vue+nginx+django 实现前后端分离
    linux mysql 主从复制
    linux redis
    linux mysql主从复制
    linux python虚拟环境 相关的
    linux dns
    2 linux vim sudo 文件权限
  • 原文地址:https://www.cnblogs.com/iOSJason/p/4146005.html
Copyright © 2011-2022 走看看