• 工程日记之ChildLost(2) :如何编写一个多线程的程序


    Dispatch

    Dispatch结合语言特性,运行时,和系统的特点,提供了系统的,全面的高层次API来提升多核多线程编程的能力。

    Dispatch会自动的根据CPU的使用情况,创建线程来执行任务,并且自动的运行到多核上,提高程序的运行效率。对于开发者来说,在GCD层面是没有线程的概念的,只有队列(queue)。任务都是以block的方式提交到对列上,然后GCD会自动的创建线程池去执行这些任务。

    这里称作对列队列是一个FIFO数据结构,意味着先提交到队列的任务会先开始执行)。DispatchQueue背后是一个由系统管理的线程池。

    最简单的,可以按照以下方式初始化一个队列

    //这里的名字能够方便开发者进行Debug
    let queue = DispatchQueue(label: "com.Leo.demoQueue")
    //这样就创建了一个自己的队列,可以向它提交任务闭包

    Sync和Async 

    提交任务的函数,async阻塞当前线程

    还有DispatchQueue.global().asyncAfter(deadline: deadline){ }  提交晚一点执行

    Qos

    任务或者队列的优先级

    User Interactive 和用户交互相关,比如动画等等优先级最高。比如用户连续拖拽的计算
    User Initiated 需要立刻的结果,比如push一个ViewController之前的数据计算
    Utility 可以执行很长时间,再通知用户结果。比如下载一个文件,给用户下载进度。
    Background 用户不可见,比如在后台存储大量数据

    Semaphore

    DispatchSemaphore是传统计数信号量的封装,用来控制资源被多任务访问的情况。

    还可以使一个变量线程安全:

    使用GCD,队列同步有另外一种方式 - sync,讲属性的访问同步到一个queue上去,就能保证在多线程同时访问的时候,线程安全。

    dataQueue.sync { privateData = newValue}

    Barrier

    以barrier flag提交的任务能够保证其在并行队列执行的时候,是唯一的一个任务。(只对自己创建的队列有效,对gloablQueue无效)

    典型的场景就是往NSMutableArrayaddObject

    原文链接:https://blog.csdn.net/hello_hwc/article/details/54293280

  • 相关阅读:
    opencv中彩色图转换成灰度图rgb2gray
    C和MATLAB中:同时对多个变量连续赋值
    error LNK2019: 无法解析的外部符号
    空间中两直线位置关系
    百度网盘不能绑定QQ
    matlab中双站异面直线法定位目标
    Sublime Text3编辑器简介
    Sybase IQ使用过程中注意事项
    Sybase数据库常用函数
    Sybase数据库第三方软件安装
  • 原文地址:https://www.cnblogs.com/Plorde/p/12315706.html
Copyright © 2020-2023  润新知