工程日记之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无效)
典型的场景就是往NSMutableArray
里addObject
。
原文链接:https://blog.csdn.net/hello_hwc/article/details/54293280
最新文章
- java中 用telnet 判断服务器远程端口是否开启
- Android应用反破解的思路
- python 线程之_thread
- CentOS6.5菜鸟之旅:VIM插件NERDtree初探
- PHP回调函数的几种用法
- URL地址中的转义符
- 从零开始学android开发-通过WebService进行网络编程,使用工具类轻松实现
- poj2400Supervisor, Supervisee(KM)
- 自定义View-6 状态按钮 滑动 点击
- 海量数据挖掘MMDS week7: 相似项的发现:面向高相似度的方法
- 牛客小白D题(STL的迭代器)
- (转)WebSocket学习
- [转]RabbitMQ系列(一):Windows下RabbitMQ安装及入门
- css 边距等常用设置
- Analysis of single cell RNA-seq data(单细胞终极课程)
- [html] 回到页首
- maven快速入门之安装
- NOIP 2014 提高组 Day2
- 【论文笔记】Leveraging Datasets with Varying Annotations for Face Alignment via Deep Regression Network
- Python线程event
热门文章
- 剑指offer 把字符串转化为整数
- Day4 - I - Trucking HDU - 2962
- 新闻类网站的通用爬虫--GNE
- 树莓派1 安装使用 ZeroTier
- Ubuntu18.04 LTS 搭建Cassandra集群
- window安装dlib、face_recognition
- 关于cvPyrSegmentation(src, dst, storage, &;comp, level, threshold1, threshold2)函数报错的问题解答
- Visual Studio Code 断点调试配置方法(请按我的步骤 一定可以做到)
- [转]Spark SQL2.X 在100TB上的Adaptive execution(自适应执行)实践
- Aspen安装过程报错总结