IOS多线程

IOS多线程结构图

基本概念

  • 进程: 一个具有一定独立功能的程序关于某个数据集合的一次运行活动。可以理解成一个运行中的应用程序
  • 线程:*** 程序执行流的最小单元,线程是进程中的一个实体***。
  • 同步: 只能在当前线程按先后顺序依次执行,不开启新线程
  • 异步: 可以在当前线程开启多个新线程执行,可不按顺序执行
  • 队列: 装载线程任务的队形结构
  • 并发: 线程执行可以同时一起进行执行
  • 串行: 线程执行只能依次逐一先后有序的执行
    一个进程可以有多个线程,也可以有多个队列

线程种类

  • Pthread
    pthread是一套C语言的多线程API
    1)优点:能够跨平台/可移植 能够在UNIX/LINX/Windows 下运行 。
    2)缺点:使用难度比较大, 需要程序员手动管理线程的生命周期 。

  • NSThread
    是一套OC框架, 基于对Pthread的封装,具有面相对象特性。
    1)优点:NSThread 轻量级最低,相对简单。
    2)缺点:手动管理所有的线程活动,如生命周期、线程同步、睡眠等。

  • GCD
    Grand Central Dispatch (GCD)Apple开发的一个多核编程的解决方法。旨在代替NSThread多线程技术,充分利用设备的多核。也是一套基于C语言的API 不需要程序员手动管理线程的声明周期 。
    1)优点:最高效,避开并发陷阱。
    2)缺点:基于C实现(不算缺点,我挺喜欢用的)。

  • NSOperation
    是一套OCAPI,是对GCD的封装 使用更加面向对象 , 不需要程序员手动管理线程的声明周期。

  • 先将需要执行的操作封装到一个NSOperation对象中

  • 然后将NSOperation对象添加到NSOperationQueue

  • 系统会自动将NSOperationQueue中的NSOperation取出来

  • 将取出的NSOperation封装的操作放到一条新线程中执。
    NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类
    ● 使用NSOperation子类的⽅方式有3种
    NSInvocationOperation,NSBlockOperation,自定义子类继承NSOperation,实现内部相应的方法。
    1)优点:自带线程周期管理,操作上可更注重自己逻辑。
    2)缺点:面向对象的抽象类,只能实现它或者使用它定义好的两个子类:NSInvocationOperationNSBlockOperation

NSInvocationOperation:

创建NSInvocationOperation对象
- (id)initWithTarget:(id)target selector:(SEL)sel object:(id)arg;

● 调用start方法开始执行操作- (void)start; 一旦执行操作,就会调用targetsel方法
● 默认情况下,调用了start方法后并不会开一条新线程去执行操作,而是在当前线程同步执行操作
● 只有将NSOperation放到⼀一个NSOperationQueue中,才会异步执⾏行操作。

多线程概念

1个进程中可以开启多条线程,每条线程可以并发(同时:并非真正意义上得同时)执行不同的任务。
多线程技术解决了在同一条线程中执行多个任务的需要等待问题,多线程可以将多任务分配不同的线程,减少单线程执行多任务的负担,使得一条线程执行一个任务。

多线程并发执行的概念:

因为同一时间内,cpu只能处理1条线程,只有一条线程在执行任务。
其实多线程并发执行的实质,是cup快速地在多线程之间调度.
因为cpu调度的线程的速度非常快,就造成了多线程并发执行的假象

但是注意点:
如果在进程中开辟的线程非常多,cup会在众多的线程中进行频繁调度,会使得cpu累死,消耗大量的cup资源。而且 会使得每个线程被调度执
行的频次会降低,完成单个线程的任务的时间就会被延续的更长,线程的执行效率大幅度降低,所以我们规定在一个进程中,开辟的分线程数不要超过五个。

多线程并发原理图

多线程的优缺点:

优点:能够适当提高程序的执行效率,能够适当提高资源的利用率;

缺点: 开启线程需要占⽤一定的内存空间(默认情况下,主线程占⽤用1M,⼦子线程占用512KB),如果开启⼤大量的线程,会占⽤用⼤大量的内存空间,降低程序的性能。线程越多,CPU在调度线程上的开销就越⼤大。

多线程中主线程的概念

一个iOS程序运行后,会默认开启1条线程,成为“主线程”或“UI线程”;
主线程的作用:显示和刷新UI界面,处理UI事件(点击事件,滚动事件,拖拽事件)。

主线程的使用注意:
不要将比较耗时的操作放在主线程中:耗时操作会卡住线程,严重影响UI的流畅度,给用户一种“卡”的坏体验。

多线程的安全隐患

资源共享:一块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源;比如多线程访问同一个对象,同一个变量,同一个文件;
就是在多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题;

安全隐患的解决——互斥锁与自旋锁

互斥锁的使用格式:@synchronized(Object){//需要锁定的代码},互斥锁使用的是线程同步技术,在锁定的时候,其他线程处于睡眠状态,等待条件满足,再被唤醒。
互斥锁的优缺点:

  • 优点:能够有效的防止因多线程抢夺资源造成的数据安全问题。
  • 缺点:需要消耗大量的CPU资源。

自旋锁;在锁定的时候,其他线程会做死循环,一直等待这个条件满足,一旦条件满足立马执行。

多线程中锁的应用

  • OC中定义属性有nonatomicatomic两种。atomic是原子性,为setter方法加锁。nonatomic是非原子性的,不需要为setter方法加锁。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,612评论 5 471
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,345评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,625评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,022评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,974评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,227评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,688评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,358评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,490评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,402评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,446评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,721评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,802评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,013评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,504评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,080评论 2 341

推荐阅读更多精彩内容

  • 多线程 在iOS开发中为提高程序的运行效率会将比较耗时的操作放在子线程中执行,iOS系统进程默认启动一个主线程,用...
    郭豪豪阅读 2,581评论 0 4
  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...
    tangsl阅读 4,085评论 0 23
  • 什么是进程? 进程是指在系统中正在运行的一个应用程序。 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存...
    珍此良辰阅读 1,241评论 1 5
  • 欢迎大家指出文章中需要改正或者需要补充的地方,我会及时更新,非常感谢。 一. 多线程基础 1. 进程 进程是指在系...
    xx_cc阅读 7,168评论 11 70
  • 少时多虑,探究人生的终极意义,爱哲学,喜欢被窝里看闲书,多晚睡,总觉得白天多了份疲倦。 大学里尤甚,一本书看到精彩...
    秋水长天MM阅读 609评论 0 2