线程总结篇:

总结:
1.进程和线程
进程是系统中正在运行的一个应用程序,活动监视器可以看到。
线程是CPU执行任务的最小单元。
进程是CPU分配资源的最小单元。
一个应用程序运行至少有一个进程,一个进程中至少有一个主线程。
2.iOS 中的线程 应用
pthread NSThread GCD NSOpreation
1.pthread:
pthread_create(&threadId, NULL, &demo, (__bridge void *)(str));

2.NSThread- 写常驻线程。
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:@"jack"];
[NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"jack"];
[self performSelectorInBackground:@selector(run:) withObject:@"jack"];
2.1
NSThread start()方法源码里面会启动一个nsthreadLauncher方法
[t main];
[NSThread exit];
- (void) main
{
略。。。
[_target performSelector: _selector withObject: _arg];
}
所以要把常驻线程写在selector里面,子线程的runloop 默认是停止的。


屏幕快照 2019-03-06 下午4.18.30.png

2.2sched_yield :sched_yield()这个函数可以使用另一个级别等于或高于当前线程的线程先运行。如果没有符合条件的线程,那么这个函数将会立刻返回然后继续执行当前线程的程序.
2.3线程死了之后就不能被开启。
2.4[NSThread sleepForTimeInterval:2.0]; 阻塞
2.5 cancel finished.
如果刚开始就被cancel了 线程中的任务没有执行,所以就不会执行。
如果任务开始了,cancel 这个线程,任务不会停止,直到执行完。
exit可以停止线程。杀掉主线程,但app不会挂掉,后面的代码不会执行。

20FAA9A4B4511980353E61A405C6F930.png
12036E02AE31A2A5870520A61EE148CC.png

3.GCD:
任务的执行方式:同步任务,异步任务,
队列的调度:队列是用来调度任务的,串行,并发。
3.1dispatch_async(queue,block) async 异步队列,dispatch_async 函数会立即返回, block会在后台异步执行。
dispatch_sync(queue,block) sync 同步队列,dispatch_sync 函数不会立即返回,及阻塞当前线程,等待 block同步执行完成。

dispatch_sync(dispatch_get_main_queue() ^{

});

主队列 会在主线程执行


D6677A40-E963-4182-9473-4373F9A7228E.png

同步主队列
同步串行队列
同步并行

异步主队列

异步串行
dispatch_queue_t q = dispatch_queue_create("tanzhouios", NULL);

异步并行
dispatch_queue_t q = dispatch_queue_create("tanzhou", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(q, ^{
NSLog(@"%@ %d",[NSThread currentThread],i);
});
dispatch_queue_t q = dispatch_get_global_queue(0, 0);

有一个互斥锁。
dispatch_once(&onceToken, ^{
//只会执行一次!!
NSLog(@"执行了%@",[NSThread currentThread]);
});
GCD延时执行:
dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC));
dispatch_after(when, dispatch_queue_create("tanzhou", NULL), ^{
NSLog(@"%@",[NSThread currentThread]);
});
异步组:
dispatch_group_async()
栅栏-多读单写。
dispatch_barrier_async()

  1. NSOperation 是一个抽象类,不具备操作的能力,必须使用他的子类。
    NSInvacationOperation
    NSBlockOperation
    添加任务依赖:
    任务执行状态控制:
    4.1
    start()自行控制任务状态。执行状态。
    start (){
    main()底层控制变更任务执行完成状态,以及任务退出。
    }
    状态改变-KVO的方式:
    系统怎么移除一个isFinished = YES 的NSOperation的?
    答案:通过KVO.的方式。

    4.2 最大并发数
    最大并发数量如果是2 会保持最多有两个线程在执行,线程没有任务会被回收,重新创建线程
    4.3 暂停&恢复
    如果队列被挂起,就不在队列里面拿操作了。
    如果挂起队列的时候,正在执行的任务不会暂停。
    队列的 cancelAll
    队列的 isSuspended 暂停 继续。

[op2 addDependency:op1];//op2 依赖于 op1 == op1 执行完毕 op2 开始执行
[op3 addDependency:op2];

// !!千万注意!!!: 不要循环依赖!!!!,一旦指定了循环依赖,队列就不能执行被循环依赖的操作了!!
//不会造成死锁! 但是 以前的版本 会死锁!!


B4D654897641F2D59455D5A2B073E7CD.png

5.锁:
自旋锁:
OSSpinLock 自旋锁(虽然已经被证明不安全 优先级翻转),性能最高的锁。原理很简单,就是一直 do while 忙等。它的缺点是当等待时会消耗大量 CPU 资源,所以它不适用于较长时间的任务。对于内存缓存的存取来说,它非常合适。
自旋锁。循环等待访问,不释放资源。
具体来说,如果一个低优先级的线程获得锁并访问共享资源,这时一个高优先级的线程也尝试获得这个锁,它会处于 spin lock 的忙等状态从而占用大量 CPU。此时低优先级线程无法与高优先级线程争夺 CPU 时间,从而导致任务迟迟完不成、无法释放 lock。这并不只是理论上的问题,libobjc 已经遇到了很多次这个问题了,于是苹果的工程师停用了 OSSpinLock。主要原因发生在低优先级线程拿到锁时,高优先级线程进入忙等(busy-wait)状态,消耗大量 CPU 时间,从而导致低优先级线程拿不到 CPU 时间,也就无法完成任务并释放锁。这种问题被称为优先级反转
互斥锁:如果共享数据已经有其他线程加锁了,线程会进入休眠状态等待锁。一旦被访问的资源被解锁,则等待资源的线程会被唤醒。
自旋锁:如果共享数据已经有其他线程加锁了,线程会以死循环的方式等待锁,一旦被访问的资源被解锁,则等待资源的线程会立即执行。
自旋锁的效率高于互斥锁。
查看 CoreFoundation 的源码能够发现,苹果至少在 2014 年就发现了这个问题,并把CoreFoundation 中的 spinlock 替换成了 pthread_mutex。
信号量
pthread_mutex 不是使用忙等,而是阻塞线程并睡眠.
信号量:
dispatch_semaphore_create(信号量值)
//等待降低信号量
dispatch_semaphore_wait
//提高信号量
dispatch_semaphore_signal
假设现在系统有两个空闲资源可以被利用,但同一时间却有三个线程要进行访问,这种情况下,该如何处理呢?
或者
我们要下载很多图片,并发异步进行,每个下载都会开辟一个新线程,可是我们又担心太多线程肯定cpu吃不消,那么我们这里也可以用信号量控制一下最大开辟线程数。

dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);

1.dispatch_semaphore_create:创建一个Semaphore并初始化信号的总量
2.dispatch_semaphore_signal:发送一个信号,让信号总量加1
3.dispatch_semaphore_wait:可以使总信号量减1,当信号总量为0时就会一直等待(阻塞所在线程),否则就可以正常执行。类似于停车位。


9A7D86E63C8104F611710D50213454DE.png

递归锁:
NSRecursiveLock 递归锁。重入
NSLock:[lock. lock];[lock. unlock];
方法再一个 [lock. lock];[lock. unlock];会重入,

@synchronized 单列对象时候使用。保证对象是唯一的。

Atomic: nsmutableArray 付给值是安全的。但是添加和操作这个array是不安全的。

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

推荐阅读更多精彩内容

  • 娟 是一个特别爱闹腾 特别爱笑的一个女孩 跟她在一起特别开心 没有烦恼 仿佛每根神经都在放松 她总是把我带在...
    李飞啊阅读 286评论 0 0
  • 银色的沙滩, 皎洁的月光, 手牵着手, 光着脚丫, 留下脚印一串串。 你侬我侬, 天长地久, 陪你到天涯海角, 陪...
    谁能任性不认命_572a阅读 170评论 3 11
  • 新年的爆竹尚未落幕 手机里传来了朋友的祝福 情人节快乐 快乐情人节 ...
    孤谷寞陌阅读 228评论 0 0
  • 1,从本篇文章中学到了重要的概念; 一篇文章,首先整体的不受干扰的看一遍,然后再多次阅读(包括把不会的反复看。查)...
    萝卜学者阅读 112评论 1 0
  • 亲爱的(七年后的自己),还记得咱们勾搭上的日子吗? 我想你一定和我一样不会忘记:2018年2月14日这个情人节!这...
    娟娟呀阅读 1,297评论 3 5