iOS中GCD多线程开发技术

GCD 全称 Grand Central Dispatch,翻译过来就是 "高级集中调度"的意思,随着GCD的出现,dispatch_queue, dispatch_group, dispatch_semaphore 这些关键词渐渐出现在各iOS开发论坛和网站中。我在工作中使用GCD技术也有2年多了,这次抽空将 GCD 的几个关键技术整理下来,方便今后查阅。




下面来逐一说说GCD中的一些关键词:
<h3>dispatch_queue</h3>
[code]
//attr DISPATCH_QUEUE_CONCURRENT:创建并行queue,iOS5和OSX7以后支持该特性; DISPATCH_QUEUE_SERIAL:创建串行queue,默认值为NULL。
dispatch_queue_create(const char *queue_label, dispatch_queue_attr attr)


//在不阻塞当前线程的情况下,将 block 提交到 queue 上异步执行。
void dispatch_async(dispatch_queue_t queue, dispatch_block_t block);


//与上面相反,等 block 执行完后,当前线程继续执行后续工作。
void dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
[/code]
<h3>dispatch_group</h3>
[code]
//以下为伪代码,不可执行,用以说明问题
//将 block1, block2 分别提交到各自的 dispatch_queue (也可以为同一个diaptch_queue)上异步执行。
dispatch_group_async(dispatch_group_t group1,
dispatch_queue_t queue1,
dispatch_block_t block1);


dispatch_group_async(dispatch_group_t group,
dispatch_queue_t queue2,
dispatch_block_t block2);


//等待直到 group1 中的任务数降为0再继续后面的代码。其中超时参数代表等待超时的长短,如果超时,则直接往后执行。(DISPATCH_TIME_FOREVER:值为~0ull。 DISPATCH_TIME_NOW:值为0。)
dispatch_group_wait(dispatch_group_t group1, dispatch_time_t timeout);


dispatch_group_async(dispatch_group_t group1,
dispatch_queue_t queue1,
dispatch_block_t block1);


//其实,dispatch_group 的作用就是将提交到 dispatch_queue 上的 block 进行分组,以 dispatch_group_wait 函数为分界线,然后以组为单位进行组内的任务调度工作。一切都是以 block 为最基本的任务单元来操作。
[/code]
<h3>dispatch_semaphore</h3>
信号量用来控制线程间同步操作,一般流程是,需要同步的代码,在执行前发送等待信号,锁住该段代码的入口,执行完毕后发送信号通知解锁。其他线程也同样。具体代码如下:


[code]
dispatch_semaphore_t semaph = dispatch_semaphore_create(1L);


//加锁
dispatch_semaphore_wait(semaph);
//受保护代码
//....
//解锁
dispatch_semamphore_singal(semaph);
[/code]


<h3>dispatch_once</h3>
下面这段代码,作用是保护代码只被执行一次,onceToken 的地址被传给 dispatch_once 函数,ton
[code]
    static dispatch_once_t onceToken;
    dispatch_once(&amp;amp;onceToken, ^{
        if (!_hasRan) {
            hugeComputing();
            _hasRan = YES;
            NSLog(@&amp;quot;%s  HasRun!&amp;quot;, __FUNCTION__);
        }
    });


[/code]


<h3>dispatch_suspend 和 dispatch_resume </h3>
这两个函数作用是在 dispatch_queue 的 block 单元之间进行暂停和恢复的操作,因此,在一个 block 执行完毕之前,该 dispatch_queue 是不会暂停的。


[参考]
<a href="http://www.cocoanetics.com/2012/02/threadsafe-lazy-property-initialization/">http://www.cocoanetics.com/2012/02/threadsafe-lazy-property-initialization/</a>
<a href="https://developer.apple.com/library/ios/DOCUMENTATION/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html">https://developer.apple.com/library/ios/DOCUMENTATION/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html</a>
<a href="http://opensource.apple.com/source/libdispatch/libdispatch-84.5.5/src/">libdispatch 的源代码</a>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值