iOS中GCD多线程开发技术

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

下面来逐一说说GCD中的一些关键词:

dispatch_queue

//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);

dispatch_group

//以下为伪代码,不可执行,用以说明问题
//将 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 为最基本的任务单元来操作。

dispatch_semaphore

信号量用来控制线程间同步操作,一般流程是,需要同步的代码,在执行前发送等待信号,锁住该段代码的入口,执行完毕后发送信号通知解锁。其他线程也同样。具体代码如下:

dispatch_semaphore_t semaph = dispatch_semaphore_create(1L);

//加锁,通知其他可能的线程等待此处代码
dispatch_semaphore_wait(semaph);
//受保护代码
//....
//解锁
dispatch_semamphore_singal(semaph);

dispatch_once

下面这段代码,作用是保护代码只被执行一次,onceToken 的地址被传给 dispatch_once 函数,ton

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (!_hasRan) {
            hugeComputing();
            _hasRan = YES;
            NSLog(@"%s  HasRun!", __FUNCTION__);
        }
    });

dispatch_suspend 和 dispatch_resume

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

[参考]
http://www.cocoanetics.com/2012/02/threadsafe-lazy-property-initialization/
https://developer.apple.com/library/ios/DOCUMENTATION/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html
libdispatch 的源代码

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Post Navigation

This page loaded in 0.221 seconds with 32 database queries.