ios--进程/多线程/同步任务/异步任务/串行队列/并行队列(对比分析)

摘要:
两者都具有高优先级,最终导致僵局。如果线程被阻塞,则无法在主线程队列中启动同步。如果无法在主线程队列中启动同步,则主线程将被阻止。因为串行队列中的线程有一个执行顺序,所以下面打开的同步任务只能在上述同步任务完成后才能执行。主线程队列和GCD创建的队列不同。

现在先说两个基本的概念,啥是进程,啥是线程,啥又是多线程;先把这两个总是给弄清再讲下面的

进程:正在进行的程序,我们就叫它进程.

线程:线程就是进程中的一个独立的执行路径.这句话怎么理解呢! 一个程序它是按顺序从上往下执行的, 这个执行顺序我们可以把它看成是一条线,把这条线就叫做线程(个人理解,错了勿喷);每一个程序中至少包含一条线程, 这条线程,我们叫它主线程.

多线程:多线程也就是说一个程序中有多条执行路径.在iOS当中将一些比较耗时的操作放到另一条执行路径里.让它与主线程同时运行.这样不会造成主线程的堵塞.

扯完了这些那我们来看看什么是任务,什么是队列!

任务分为同步任务与异步任务,它们的区别是:
    同步任务优先级高,在线程中有执行顺序,不会开启新的线程。
    异步任务优先级低,在线程中执行没有顺序,看cpu闲不闲。在主队列中不会开启新的线程,其他队列会开启新的线程。

队列:队列我们可以把它理解为是管理任务的,它里面放着很多的任务,来管理这些任务什么时候在哪些线程里面执行.队列是先进先出的

队列分为串行队列和并行队列

串行队列:队列中的任务按顺序执行(不会同时执行)
并行队列:队列中的任务会并发执行,可能会有一个疑问,队列不是先进先出吗,如果后面的任务执行完了,怎么出去的了。这里需要强调下,任务执行完毕了,不一定出队列。只有前面的任务执行完了,才会出队列。

串行队列开启异步任务,是有顺序的

并行队列里开启同步任务是有执行顺序的,只有异步才没有顺序

来侃侃在主队列中开启同步任务为什么会阻塞线程?

在主队列开启同步任务,因为主队列是串行队列,里面的线程是有顺序的,先执行完一个线程才执行下一个线程,而主队列始终就只有一个主线程,主线程是不会执行完毕的,因为他是无限循环的,除非关闭应用程序。因此在主线程开启一个同步任务,同步任务会想抢占执行的资源,而主线程任务一直在执行某些操作,不肯放手。两个的优先级都很高,最终导致死锁,阻塞线程了

主线程队列中不能开启同步

主线程队列中不能开启同步,会阻塞主线程。只能开启异步任务,开启异步任务也不会开启新的线程,只是降低异步任务的优先级,让cpu空闲的时候才去调用。而同步任务,会抢占主线程的资源,会造成死锁。

 

为啥串行队列开启异步任务后嵌套同步任务造成死锁?(不作死就不会死)

因为串行队列中线程是有执行顺序的,需要等上面开启的异步任务执行完毕,才会执行下面开启的同步任务。而上面的异步任务还没执行完,要到下面的大括号才算执行完毕,而下面的同步任务已经在抢占资源了,就会发生死锁。


串行队列中开启同步任务后嵌套同步任务造成死锁(再套几下,就不知道怎么死的了)?

因为串行队列中线程是有执行顺序的,需要等上面开启的同步任务执行完毕,才会执行下面开启的同步任务。而上面的同步任务还没执行完,要到下面的大括号才算执行完毕,而下面的同步任务已经在抢占资源了,就会发生死锁

串行队列开启同步任务后嵌套异步任务就不会造成死锁,开启异步,就会开启一个新的线程,不会阻塞线程

主线程队列和GCD创建的队列也是有区别?

主线程队列和GCD创建的队列是不同的。在GCD中创建的队列优先级没有主队列高,所以在GCD中的串行队列开启同步任务里面没有嵌套任务是不会阻塞主线程,只有一种可能导致死锁,就是串行队列里,嵌套开启任务,有可能会导致死锁。

免责声明:文章转载自《ios--进程/多线程/同步任务/异步任务/串行队列/并行队列(对比分析)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Electron 自定义软件顶部菜单、右键菜单以及绑定快捷键操作系统内存大页(THP)对redis性能的影响下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

多线程之Nsthread的使用方法

一 NSThread的基本使用 1)NSThread创建的四种方式 第一种 创建方式 alloc initwith...... 特点:需要手动启动线程,可以拿到线程对象进行详细设置 //创建线程 NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selecto...

算法竞赛专题解析(5):简单数据结构

本系列是这本算法教材的扩展资料:《算法竞赛入门到进阶》(京东当当 ) 清华大学出版社如有建议,请联系:(1)QQ 群,567554289;(2)作者QQ,15512356 目录 1 链表 1.1 动态链表 1.2 用结构体实现单向静态链表 1.3 用结构体实现双向静态链表 1.4 用一维数组实现单向静态链表 1.5 STL list 1.6 链表习题...

生产者消费者模式

目录 单生产和消费模式 多生产和消费模式 通过管道实现线程通信 单生产和消费模式 在Java中,负责产生数据的模块的是生产者,负责使用数据的模块是消费者,生产者消费者解决数据的平衡问题,即先有数据才能使用,没有数据时消费者需要等待。 例如:有一个饭店,它有一个厨师和一个服务员,服务员必须等厨师把菜做好了,通知到服务员才能上菜,然后返回继续等待,厨师...

python网络编程 day35 网络编程——进程池,线程池、协程、回调函数、gevent模块、asyncio模块

一、内容回顾 面试题: 请聊聊进程队列的特点和实现原理 进程之间可以互相通信 IPC 数据安全 先进先出 实现原理 管道+锁 管道是基于文件级别的socket+pickle实现的 你了解生产者消费者模型吗? 了解 为什么了解? 工作经历: 采集图片,爬取音乐,主要是爬取大量数据,想提高爬虫效率,有用过一个生产者消费者模型,这个模型...

golang 之GPM模型

1、Golang调度器的由来 2、Goroutine调度器的GMP模型及设计思想 3、Goroutine调度场景过程全图文解析 早期的单进程操作系统,面临2个问题: 1.单一的执行流程,计算机只能一个任务一个任务处理。 2.进程阻塞所带来的CPU时间浪费。 多进程/线程时代有了调度器需求: 进程拥有太多的资源,进程的创建、切换、销毁,都会占用很长的时间,...

WPF 同一窗口内的多线程 UI(VisualTarget)

WPF 的 UI 逻辑只在同一个线程中,这是学习 WPF 开发中大家几乎都会学习到的经验。如果希望做不同线程的 UI,大家也会想到使用另一个窗口来实现,让每个窗口拥有自己的 UI 线程。然而,就不能让同一个窗口内部使用多个 UI 线程吗? 答案其实是——可以的!使用 VisualTarget 即可。 阅读本文将收获一份对 VisualTarget 的解读以...