工程日记之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

原文地址:https://www.cnblogs.com/Plorde/p/12315706.html