多线程知识巩固(2)

本文详细介绍了GCD中的调度队列类型,包括串行队列、并行队列以及主队列的特性与使用。同时讲解了如何创建和管理调度队列,特别是串行队列的创建与内存管理。此外,还探讨了Block在GCD中的应用,包括异步、同步任务的添加,以及在任务完成后执行completion block和并发执行循环迭代的方法。
摘要由CSDN通过智能技术生成

1、关于调度队列

所有的调度队列都是先进先出队列,因此,队列中的任务的开始的顺序和添加到队列中的顺序相同。GCD自动的为我们提供了一些调度队列,我们也可以创建新的用于具体的目的。

下面列出几种可用的调度队列类型以及如何使用。

(1)serial queues(串行队列)又称私有调度队列(private),一般用再对特定资源的同步访问上。我们可以根据需要创建任意数量的串行队列,每一个串行队列之间是并发的。

(2)并行队列,又称global dispatch queue。并行队列虽然可以并发的执行多个任务,但是任务开始执行的顺序和其加入队列的顺序相同。我们自己不能去创建并行调度队列。只有三个可用的global concurrent queues。

(3)main dispatch queue 是一个全局可用的串行队列,其在行用程序的主线程上执行任务。此队列的任务和应用程序的主循环(run loop)要执行的事件源交替执行。因为其运行在应用程序的主线程,main queue经常用来作为应用程序的一个同步点。

2、关于队列的一些技术

除了调度队列,GCD还提供了一些有用的技术来帮助我们管理代码。

 
 
 
  1. dispath group ,dispatch semaphore, dispath sources 

3、使用blocks去实现tasks

block objects是基于C语言的特征,可以用在C,C++ Objective-c中。一个block虽然和函数指针有些相似,但是实际上代表一个底层数据结构,类似与对象,有编译器去创建和管理。

block的一个优势是可以使用其自己作用域外的变量,例如,一个block可以读取其父作用域的变量值,此值是copy到了block heap的数据结构中。当block被加入到dispatch queue中,这些值通常为只读形式。

block的声明和函数指针类似,只是把*改为了^,我们可以传递参数给block,也可以接收其返回的值。

4、创建和管理调度队列

(1)获得全局并发调度队列(global concurrent dispath queues)

系统给每一个应用程序提供了三个concurrent dispatch queues。这三个并发调度队列是全局的,它们只有优先级的不同。因为是全局的,我们不需要去创建。我们只需要通过使用函数dispath_get_global_queue去得到队列,如下:

 
 
 
  1. dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  

除了得到default的并发队列,还可以通过传递参数DISPATCH_QUEUE_PRIOPITY_HIGH和DISPATCH_QUEUE_PRIOPITY_LOW去得到高优先级或者低优先级的。(第二个参数是为以后扩展保留的)

虽然dispatch queue是引用计数对象,但是在此因为队列是全局的,不需要我们去retain或者release,我们需要使用的时候直接调用函数dispath_get_global_queue就可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值