GCD多线程

GCD由浅入深学习


由于GCD相关知识比较多,因此这里分成两篇文章总结。

引言


虽然GCD使用很广,而且在面试时也经常问与GCD相关的问题,但是我相信深入理解关于GCD知识的人肯定不多,大部分都是人云亦云,只是使用过GCD完成一些很简单的功能。当然,使用GCD完成一些简单的功能,通常已经能够满足我们的需求了。不过,笔者比较喜欢刨根问底,因此在这里记录下学习的过程。

Tips

 

高手可绕边走!!!

简介


iOS实现提供实现多线程的方案有:NSThreadNSOperationGCD

iOS所有实现多线程的方案中,GCD应该是最有魅力的,而且使用起来也是最方便的,因为GCD是苹果公司为多核的并行运算提出的解决方案。

GCDGrand Central Dispatch的简称,它是基于C语言的。使用GCD,我们不需要编写线程代码,其生命周期也不需要我们手动管理,定义想要执行的任务,然后添加到适当的调度队列,也就是dispatch queueGCD会负责创建线程和调度任务,系统直接提供线程管理。

由于GCD是基于C语言的,因此使用起来对于没有学习过C语言的同学们,相对困难一些。不过,事实上使用是很简单,只要注意死锁等问题就好了。

概念:队列(Queue)


我们需要了解队列的概念,GCD提供了dispatch queues来处理代码块,这些队列管理所提供给GCD的任务并用FIFO顺序执行这些任务。这样才能保证第一个被添加到队列里的任务会是队列中第一个开始的任务,而第二个被添加的任务将第二个开始,如此直到队列的终点。

概念:调度队列(dispath queue)


所有的调度队列(dispatch queues)自身都是线程安全的,我们能从多个线程并行的访问它们。 GCD的优点是显而易见的。我们需要了解调度队列如何我们的代码的不同部分提供线程安全,以决定使用何种队列,在哪个线程上执行等。

GCD将长期运行的任务拆分成多个工作单元,并将这些单元添加到dispath queue中,系统会管理这些dispath queue,为我们在多个线程上执行工作单元,我们不需要手动启动和管理后台线程。

系统提供了许多预定义的dispath queue,包括始终在主线程上执行工作的dispath queue。我们可以创建自己的dispath queue,而且可以创建任意多个。GCDdispath queue严格遵循FIFO(先进先出)原则,添加到dispath queue的工作任务将按照加入dispath queue的顺序启动。

概念:串行(Serial)


我们在学习操作系统这门课程的时候,经常会提到串行。我们使用GCD,也会用到串行的概念。

所谓串行(Serial)执行,指同一时间每次只能执行一个任务。

概念:并发(Concurrent)


说到串行,自然会想到并发。在操作系统这门课程中,这个概念是非常重要的。

所谓并发(Concurrent),指同一时间可以同时执行多个任务。

概念:死锁(Deadlock)


操作系统这门课程中对死锁的介绍说明有很多。在实际开发中,也经常遇到死锁的问题。

所谓死锁(Deadlock)是指它们都卡住了,并等待对方完成或执行其它操作。第一个不能完成是因为它在等待第二个的完成。但第二个也不能完成,因为它在等待第一个的完成。

概念:线程安全(Thread Safe)


还记得我们在写单例的时候都加了哪些代码吗?我们应该知道,既然要声明为单例,说明这是共享资源区,就会存在竞态条件,因此,我们必须保证只创建一次。

像这样添加了线程锁的:

还有这样用于创建单例的,以确保只执行一次:

创建和管理dispatch queue


1.获取全局并发调度队列

并发的调度队列可以同时并行地执行多个任务,但是并发队列也是队列,因此同样遵循着FIFO的原则来启动任务。因为并发执行任务与系统有关,其同时执行任务的数量是由系统根据应用和系统动态变化决定的。

现在iOS系统,为每个应用提供了四种并发的全局共享的调度队列,其区别在于优先级不一样。

原文地址:https://www.cnblogs.com/zylin/p/5138892.html