GCD的背景和使用中的一些问题
来源:互联网 发布:mac转码软件 编辑:程序博客网 时间:2024/05/21 04:42
一、多线程背景
Although threads have been around for many years and continue to have their uses, they do not solve the general problem of executing multiple tasks in a scalable way. With threads, the burden of creating a scalable solution rests squarely on the shoulders of you, the developer. You have to decide how many threads to create and adjust that number dynamically as system conditions change. Another problem is that your application assumes most of the costs associated with creating and maintaining any threads it uses.
上述大致说出了直接操纵线程实现多线程的弊端:
开发人员必须根据系统的变化动态调整线程的数量和状态,即对开发者的负担重。
应用程序会在创建和维护线程上消耗很多成本,即效率低。
相对的,GCD是一套低层级的C API,通过 GCD,开发者只需要向队列中添加一段代码块(block或C函数指针),而不需要直接和线程打交道。GCD在后端管理着一个线程池,它不仅决定着你的代码块将在哪个线程被执行,还根据可用的系统资源对这些线程进行管理。GCD的工作方式,使其拥有很多优点(快、稳、准):
快,更快的内存效率,因为线程栈不暂存于应用内存。
稳,提供了自动的和全面的线程池管理机制,稳定而便捷。
准,提供了直接并且简单的调用接口,使用方便,准确。
二、内存和安全
稍微提一下吧,因为部分人纠结于dispatch的内存问题。
内存
MRC:用dispatch_retain和dispatch_release管理dispatch_object_t内存。
ARC:ARC在编译时刻自动管理dispatch_object_t内存,使用retain和release会报错。
安全
dispatch_queue是线程安全的,你可以随意往里面添加任务。
三、拾遗
这里主要提一下GCD的一些坑和线程的一些问题。
1.死锁
dispatch_sync
// 假设这段代码执行于主队列dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);dispatch_queue_t mainQueue = dispatch_get_main_queue();// 在主队列添加同步任务dispatch_sync(mainQueue, ^{ // 任务 ...});// 在串行队列添加同步任务 dispatch_sync(serialQueue, ^{ // 任务 ... dispatch_sync(serialQueue, ^{ // 任务 ... });};
dispatch_apply
// 因为dispatch_apply会卡住当前线程,内部的dispatch_apply会等待外部,外部的等待内部,所以死锁。dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);dispatch_apply(10, queue, ^(size_t) { // 任务 ... dispatch_apply(10, queue, ^(size_t) { // 任务 ... });});
dispatch_barrier
dispatch_barrier_sync在串行队列和全局并行队列里面和dispatch_sync同样的效果,所以需考虑同dispatch_sync一样的死锁问题。
2.dispatch_time_t
// dispatch_time_t一般在dispatch_after和dispatch_group_wait等方法里作为参数使用。这里最需要注意的是一些宏的含义。// NSEC_PER_SEC,每秒有多少纳秒。// USEC_PER_SEC,每秒有多少毫秒。// NSEC_PER_USEC,每毫秒有多少纳秒。// DISPATCH_TIME_NOW 从现在开始// DISPATCH_TIME_FOREVE 永久// time为1s的写法dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC);
0 0
- GCD的背景和使用中的一些问题
- GCD的一些简单使用
- Java背景绘制分包和界面变形的一些问题
- GCD&&LCM的一些经典问题
- GCD中一些API的使用
- GCD,线程使用的一些笔记
- GCD的一些测试和总结
- GCD和LCM的一些性质
- CSS中的一些背景相关的学习
- GCD的认识和使用
- GCD的基本概念和使用
- Android设置背景透明的一些问题
- GCD中的一些高级特性
- GCD中的一些高级特性
- robotium在使用过程中的一些问题和知识点
- dataTable和select2使用过程中的一些问题
- NS2一些安装和使用的问题
- Pthreads-Win32的使用和一些问题
- 时间转换
- rabbitmq 常用命令
- java提高篇(八)----详解内部类
- 矩阵分析中的QR分解
- 【Dubbo】利用Jmeter对Dubbo接口进行压力测试
- GCD的背景和使用中的一些问题
- Java Spring IOC用法
- iOS开发中遇到的问题
- 定时任务多线程(结合spring测试)
- JS中如何定义全局变量
- 三星7420 cpu 做的手机源码你们去编译过吗?
- OpenCV 图像数据结构
- 欢迎使用CSDN-markdown编辑器
- SVG动态修改Text的文本