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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝上买的电脑商家关闭了怎么办 淘宝链接复制链链接发不出去怎么办 淘宝卖家填错地址货已经发了怎么办 拼多多没交保证金无法提现怎么办 信用卡被别人刷了没证据怎么办 我在淘宝开个店卖衣服没人买怎么办 收货地址填错了卖家已发货怎么办 淘宝店上的供货商不发货怎么办 在淘宝买的花退到卖家后死了怎么办 在淘宝买东西付款开通了花呗怎么办 淘宝网投诉卖家也不处理问题怎么办 淘宝图片空间上传不了大图片怎么办 不小心把设置里打印机删掉了怎么办 电脑上qq不小心删掉了怎么办 进了一批款式不好卖的衣服怎么办? 淘宝首页图片不居中代码装的怎么办 小语言代码装修以后不是全屏怎么办 招教年龄超过4个月怎么办 淘宝上注册的店铺被别人用了怎么办 淘宝贷款后店铺转让了贷款怎么办 手机千牛发布宝贝类目找不到怎么办 亚马逊被移除销售权该怎么办 玉米煮水不够熟吃了怎么办 华为云手机找回关了找回手机怎么办 我的淘宝号被别人盗用开店怎么办 淘宝买东西发货了不想要了怎么办 两张单号一样罚款已被处理怎么办 58同城登录电话换了怎么办 在超市买的东西坏了怎么办 安卓系统无法安装第三方软件怎么办 金立手机报毒不能安装软件怎么办 js中下拉菜单被图片挡住怎么办 更换主机后用户名跟密码忘了怎么办 换手机号了京东账号登录不上怎么办 口令卡绑定时访问页面找不回怎么办 手机淘宝购物车不小心删除了怎么办 上淘宝网图片文字不清晰怎么办 淘宝店铺低消费人群占比多怎么办 微信只能在应用商城里面打开怎么办 淘宝买了特价商品店家不发货怎么办 红米5a装不下卡怎么办