多线程(四) 何为多线程编程及优缺点

说起多线程编程,大家应该都不陌生,从字面上理解,就是利用多线程技术编程。那么线程又是什么呢?今天我们就一起来探讨一下。

1.何为线程?

从程序执行的角度来说,1个CPU执行的CPU命令列为一条无分叉路径,称之为线程。

乍一看去可能有点绕。我们从操作系统的角度说起。在iOS或者MacOS中,当我们启动一个应用程序时,OS会首先将程序中的CPU指令配置到内存中。CPU从应用程序指定的地址开始,逐行执行CPU指令。
举例:在调用sum方法时,添加调试断点,运行。

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
   
    [self sumA:9 andB:2];
}

- (int)sumA:(int)a andB:(int)b
{
    int c = a + b;
    return c;
}

查看反汇编

    0x105499823 <+51>: movq   -0x8(%rbp), %rsi
    0x105499827 <+55>: movq   0x4c12(%rip), %rdi        ; "sumA:andB:"
    0x10549982e <+62>: movq   %rdi, -0x28(%rbp)
    0x105499832 <+66>: movq   %rsi, %rdi
    0x105499835 <+69>: movq   -0x28(%rbp), %rsi
    0x105499839 <+73>: movl   $0x9, %edx
    0x10549983e <+78>: movl   $0x2, %ecx
    0x105499843 <+83>: callq  *0x27c7(%rip)             ; (void *)0x00007fff50b93780: objc_msgSend
    0x105499849 <+89>: movl   %eax, -0x2c(%rbp)
    0x10549984c <+92>: addq   $0x30, %rsp
    0x105499850 <+96>: popq   %rbp
    0x105499851 <+97>: retq   

此刻我们就很清楚的看到,程序先执行 地址0x105499823的命令movq,接着向后移动,执行下一条指令,即0x105499827的命令movq。就这样不断地执行下去。

有一种比较特殊的命令,比如if和for语句等控制语句或函数调用的情况下,执行命令行的地址会远离当前的位置即位置迁移。但是,由于一个CPU一次只能执行一条命令,不能同时执行某处分开的并列的两个命令,因此通过CPU执行的CPU指令就好比一条无分差的大道,其执行不会出现分歧。如图所示:


通过CPU执行的CPU指令

理解了上述过程,回过头来,再看我们开头提到线程的概念,相信大家应该已经理解了:线程就是一个CPU执行CPU指令的无分叉路径。

2.何为多线程编程?

现在一个物理的CPU芯片实际上有64个(64核)CPU,如果一个CPU核虚拟为两个CPU核工作,那么一台计算机上使用多个CPU核就是理所当然的事了。尽管如此,“1个CPU执行的CPU指令为一条无分叉路径”仍然不变。
这种无分叉的路径不止1条,存在多条时,即为”多线程“。在多线程中,1个CPU核执行多条不同路径上的不同命令。如图所示:


在多线程中执行CPU指令

虽然CPU的相关技术有很多,其进步也令人眼花缭乱,但基本上1个CPU核一次能够执行的CPU命令始终为1。
那么怎样才能在多条路径中执行CPU指令呢?
在iOS和MacOS中,其内核XNU在发生操作系统事件时(如每隔一定时间,唤起系统调用等情况)会切换执行路径。执行中路径的状态,例如CPU的寄存器等信息保存到各自路径专用的内存块中,从切换目标路径专用的内存块中,复原CPU寄存器的信息,继续执行切换路径的CPU指令。这称之为“上下文切换”。
由于使用多线程的程序可以在某个线程和其他线程之间反复多次进行上下文切换,因此看上去就好像1个CPU核能够并列的执行多个线程一样。而且在具有多个CPU核的情况下,就不是“看上去像了”,而是真的提供了多个CPU核并行执行多个线程的技术。
这种利用多线程编程的技术就被成为“多线程编程”。

3.多线程编程的优缺点

了解了多线程编程以后,我们来看一下多线程编程的优缺点,首先看一下缺点,即存在什么安全隐患。

存在的安全隐患
1.数据竞争问题
数据竞争

多线程更新相同资源,会导致数据不一致。
这里有两个比较经典的案例,一个是银行存取钱的问题,一个是卖票系统,在后面我们会详细讲解。

2.死锁
死锁

停止等待事件的线程会导致多个线程相互持续等待。

3.当线程过多时,会消耗大量内存。
太多线程导致消耗大量内存
优势所在

尽管极易发生各种问题,也应当使用多线程编程。这是为什么呢?因为使用多线程编程,可以保证应用程序的响应性能。
应用程序在启动时,通过最先执行的线程,即“主线程”来描绘用户界面,处理触摸屏幕等事件。如果在该主线程中进行长时间处理,如访问数据库等耗时操作,就会阻塞主线程,妨碍主线程中RunLoop的执行,从而导致不能更新用户界面、应用程序的画面长时间停滞,就是我们平时所说的卡顿现象。
这就是需要将耗时操作放在其他线程,而非主线程操作的原因。如图所示:


多线程编程的优点

将耗时操作放在其他线程中,需要回到主线程时,再回到主线程操作,就保证了用户操作界面的流畅度。

总结

1.何为线程:线程就是 1个CPU在执行CPU指令时的一条无分叉路径;
2.何为多线程编程:多线程编程就是利用多线程编程的技术o(╯□╰)o;
3.多线程编程的优缺点:
缺点:1.导致数据竞争; 2.死锁;3.线程过多时,会大量消耗内存;
优点:保证应用程序的响应性能,即良好的用户体验。

为了用户有更好的体验,所以我们还是要克服种种困难,来使用多线程编程。那么如何解决刚才提到的3个问题呢,且听下回分解。

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

推荐阅读更多精彩内容

  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...
    tangsl阅读 4,124评论 0 23
  • 多线程 Mac、iPhone的操作系统OS X、iOS根据用户的指示启动应用程序后,首先便将包含在应用程序中的CP...
    xukunluren阅读 220评论 0 0
  • 1.内存的页面置换算法 (1)最佳置换算法(OPT)(理想置换算法):从主存中移出永远不再需要的页面;如无这样的...
    杰伦哎呦哎呦阅读 3,249评论 1 9
  • 背景 前段时间锻炼身体胃出血的事情,每天想着这个事情,害怕有什么大问题!这周一才预约下周一去做胃镜检查,又要担心好...
    Dely阅读 12,329评论 25 220
  • 术语 任务:准备执行的操作,通常就是一个block块 队列:queue,存放任务,管理任务 进程——苹果电脑里的活...
    Carden阅读 314评论 0 0