美文网首页iOS
多线程GCD和NSOpreation

多线程GCD和NSOpreation

作者: 健健锅 | 来源:发表于2019-02-17 14:42 被阅读11次

/*
多线程问题 :1.死锁,2,抢占资源线程安全3,消耗大量内存
GCD 把任务添加到 DispathQueue
分为:serial DispathQueue 串行队列 等待当前处理结束
Concurrent DispathQueue 并发 不等待
可以生成多个 serial DispathQueue 共同添加任务 这样会生成多个线程 消耗资源

 获取queue方法1.
 DispathQueue 手动管理内存 生命周期 dispath_quate_t myquen = disnpatch_queue_create("name",宏)
 dispatch_release 释放   不能设置优先级 都是默认级别
 
 方法2.系统生成 Main dispatch queue(串行,添加到主线后面)  和 global dispatch queue(并行)
 
 global dispatch queue 有四个优先级 高,默认 低,后台
 
 dispatch_queue_t mianqueue = dispatch_get_main_queue()
 
 dispatch_queue_t globalqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
 这两个 进行dispatch_retain 和 dispatch_release 没有影响  使用起来更加简单

 二,
 dispatch_set_target_queue
 更改队列优先级
 修改执行层级:  x让异步线程 顺序执行
 dispatch_queue_t targetSerialQueue = dispatch_queue_create("com.gcd.setTargetQueue2.targetSerialQueue", NULL);
 
 //设置执行阶层
 dispatch_set_target_queue(serialQueue1, targetSerialQueue);
 dispatch_set_target_queue(serialQueue2, targetSerialQueue);
 dispatch_set_target_queue(serialQueue3, targetSerialQueue);
 dispatch_set_target_queue(serialQueue4, targetSerialQueue);
 dispatch_set_target_queue(serialQueue5, targetSerialQueue);
 dispatch_async(serialQueue1, ^{
 NSLog(@"1");
 });
 dispatch_async(serialQueue2, ^{
 NSLog(@"2");
 });
 dispatch_async(serialQueue3, ^{
 NSLog(@"3");
 });
 dispatch_async(serialQueue4, ^{
 NSLog(@"4");
 });
 dispatch_async(serialQueue5, ^{
 NSLog(@"5");
 });
 
 三 dispatch_after  是在相应队列相应时间以后添加任务
     四, dispatch group
     self.group = dispatch_group_create();
     dispatch_group_enter(self.group);
     dispatch_group_async(self.group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
     //请求1
     [self reuqsetDataPlannerService];////dispatch_group_leveal(self.group);
     });
     dispatch_group_enter(self.group);
     dispatch_group_async(self.group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
     //请求2
     [self requestCourseData];//dispatch_group_leveal(self.group);
     
     });
     
     dispatch_group_notify(self.group, dispatch_get_main_queue(), ^{
     
     })
     
     dispatch_async(dispatch_get_global_queue(0, 0), ^{
     
     dispatch_group_wait(disgroup, dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC));
     NSLog(@"dispatch_group_wait 结束");
     });
     
     dispatch_group_wait  设置时间限制 会阻塞线程不能放在主线程
     dispatch_barrier_asyne   dispatch_barrier_syne  插入后面任务时机不同
     
     dispatch_apply  快速迭代
     
 五,信号量 dispatch_semaphore
 
 dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);   设置可共同执行的数量
 //任务1
 dispatch_async(quene, ^{
 dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
 NSLog(@"run task 1");
 sleep(1);
 NSLog(@"complete task 1");
 dispatch_semaphore_signal(semaphore);
 });<br>
 //任务2
 dispatch_async(quene, ^{
 dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
 NSLog(@"run task 2");
 sleep(1);
 NSLog(@"complete task 2");
 dispatch_semaphore_signal(semaphore);
 });<br>
 //任务3
 dispatch_async(quene, ^{
 dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
 NSLog(@"run task 3");
 sleep(1);
 NSLog(@"complete task 3");
 dispatch_semaphore_signal(semaphore);
 });
 
 gcd原理:
 通过结构体和链表实现FIFO队列,FIFO队列管理是通过dispatch_async 等函数所追加的block  ,block 先加入dispatch continuation 结构体再加入队列
 六,实现线程同步的方法:
 dispatch_set_target_queue
 dispatch_group_create
 dispatch_barrier_asyne
 dispatch_semaphore
 ```

nsopreation
https://www.jianshu.com/p/4b1d77054b35
https://www.jianshu.com/p/938d68ed832c

OSSpinLock(自旋锁)和dispatch_semaphore的效率远远高于其他。
nslock
@synchronized和NSConditionLock效率较差。
鉴于OSSpinLock的不安全,所以我们在开发中如果考虑性能的话,建议使用dispatch_semaphore。

1.自旋锁 OSSpinLock
新版 iOS 中,系统维护了 5 个不同的线程优先级/QoS: background,utility,default,user-initiated,user-interactive。高优先级线程始终会在低优先级线程前执行,一个线程不会受到比它更低优先级线程的干扰。这种线程调度算法会产生潜在的优先级反转问题,从而破坏了 spin lock。
具体来说,如果一个低优先级的线程获得锁并访问共享资源,这时一个高优先级的线程也尝试获得这个锁,它会处于 spin lock 的忙等状态从而占用大量 CPU。此时低优先级线程无法与高优先级线程争夺 CPU 时间,从而导致任务迟迟完不成、无法释放 lock。这并不只是理论上的问题,libobjc 已经遇到了很多次这个问题了,于是苹果的工程师停用了 OSSpinLock。
解决方案1 保证访问锁的线程全部都处于同一优先级,否则 iOS 系统中所有类型的自旋锁都不能再使用了。
自旋锁 在资源被占用时 申请者不会进入睡眠状态,
os_unfair_lock 替代自旋锁 从底层调用看,等待os_unfair_lock锁的线程会处于休眠状态,并非忙等

 @synchronized  对递归锁的封装
 http://yulingtianxia.com/blog/2015/11/01/More-than-you-want-to-know-about-synchronized/
 
1. 你调用 sychronized 的每个对象,Objective-C runtime 都会为其分配一个递归锁并存储在哈希表中。
 2.如果在 sychronized 内部对象被释放或被设为 nil 看起来都 OK。不过这没在文档中说明,所以我不会再生产代码中依赖这条。
 3.注意不要向你的 sychronized block 传入 nil!这将会从代码中移走线程安全。你可以通过在 objc_sync_nil 上加断点来查看是否发生了这样的事情

相关文章

  • 多线程GCD和NSOpreation

    /*多线程问题 :1.死锁,2,抢占资源线程安全3,消耗大量内存GCD 把任务添加到 DispathQueue分为...

  • 多线程(2)——NSThread

    iOS中实现多线程的四种方案 pthread NSThread GCD NSOpreation Pthread:这...

  • iOS详解多线程(实现篇——其他方式)

    在之前的章节中,我们详细探究了多线程的相关概念、常用的实现方式(NSThread、GCD、NSOpreation)...

  • NSOperation相关

    1.Nsopreation的作用: 配合nsopreation和nsopreationqueue也能实现多线程编程...

  • OC多线程调用

    多线程主要用的主要有 两种方式 GCD 和 NSOpreation,下面主要从几个方面看一下两者的区别和使用方式...

  • 多线程----NSOperation详解

    简介 NSOpreation的作用p 配合NSOperation和NSOperationQueue也能够实现多线程...

  • iOS面试之多线程模块

    多线程 多线程内容如下: GCD NSOperation NSThread 多线程与锁 1.GCD 同步/异步和串...

  • 多线程

    参考文章:iOS多线程--彻底学会多线程之『GCD』Swift 3.0 GCD和DispatchQueue 使用解...

  • 7.3 多线程-GCD

    多线程-GCD 多线程-GCD-串行并行 多线程-GCD.png GCD-线程的通讯、延时操作、定时器 GCD-线...

  • 简单粗暴-GCD和NSOpreation的比较

    GCD是底层的C语言构成的API,而NSOperationQueue及相关对象是Objc的对象。在GCD中,在队列...

网友评论

    本文标题:多线程GCD和NSOpreation

    本文链接:https://www.haomeiwen.com/subject/ilngdqtx.html