ios多线程

iOS多线程开发(三)---Run Loop(二,三)

不羁的心 提交于 2020-03-08 09:53:08
二,何时使用Run Loop 对于辅助线程,在需要和线程有更多交互时,才使用Run Loop。 比如:1)使用端口或者自定义输入源来和其他线程通讯 2)使用线程定时器 3)Cocoa中使用任何performSelector...的方法(参考 Table: Performing selectors on other threads) 4)使线程周期性工作 三,如何使用Run Loop对象 Run Loop对象提供了 添加输入源,定时器和Run Loop的观察者以及启动Run Loop 的接口,使用Run Loop包活获取--配置--启动--退出四个过程 1,获取Run Loop的对象 A,通过NSRunLoop获取 // 获得当前thread的Run loop NSRunLoop *myRunLoop = [NSRunLoop currentRunLoop]; // 将Cocoa的NSRunLoop类型转换程Core Foundation的CFRunLoopRef类型 CFRunLoopRef ç = [myRunLoop getCFRunLoop]; B,使用CFRunLoopGetCurrent()函数 2,配置Run Loop 所谓配置Run Loop主要是给Run Loop添加输入源,定时器或者添加观察者,即设置Run Loop模式。上面函数- (void

多线程的安全隐患

吃可爱长大的小学妹 提交于 2020-03-04 08:28:13
资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象、同一个变量、同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题 安全隐患分析: 安全隐患的解决——互斥锁: 互斥锁使用格式 @synchronized(锁对象) { // 需要锁定的代码 } 注意:锁定1份代码只用1把锁,用多把锁是无效的 互斥锁的优缺点: 优点:能有效防止因多线程抢夺资源造成的数据安全问题 缺点:需要消耗大量的CPU资源 互斥锁的使用前提: 多条线程抢夺同一块资源 相关专业术语: 线程同步 线程同步的意思是:多条线程在同一条线上执行(按顺序地执行任务) 互斥锁,就是使用了线程同步技术 原子和非原子属性: OC在定义属性时有 nonatomic 和 atomic 两种选择 atomic :原子属性,为 setter 方法加锁(默认就是 atomic ) nonatomic :非原子属性,不会为 setter 方法加锁 nonatomic 和 atomic 对比 atomic :线程安全,需要消耗大量的资源 nonatomic :非线程安全,适合内存小的移动设备 iOS开发的建议 所有属性都声明为 nonatomic 尽量避免多线程抢夺同一块资源 尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力 来源: https:/

iOS多线程之GCD

这一生的挚爱 提交于 2020-03-01 22:46:57
1.简介 什么是GCD 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核、四核) GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码 2.任务和队列 GCD有两个核心概念 任务:执行什么操作 队列:用来存放任务 GCD的使用有两个步骤 定制任务 确定想做的事情 将任务添加到队列中 GCD会自动将队列中的任务取出,放到对应的线程中执行 任务的取出遵循队列的FIFO原则:先进先出,后进后出 3.执行任务 GCD中有2个用来执行任务的函数 用同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block); queue:队列 block:任务 用异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block); 同步和异步的区别 同步:在当前线程中执行 异步:在另一条线程中执行 4.队列的类型 并发队列 可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务) 并发功能只有在异步

ios 重温多线程 总结

梦想与她 提交于 2020-03-01 14:35:34
1> 无论使用哪种方法进行多线程开发,每个线程启动后并不一定立即执行相应的操作,具体什么时候由系统调度(CPU空闲时就会执行)。 2> 更新UI应该在主线程(UI线程)中进行,并且推荐使用同步调用,常用的方法如下: - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait (或者-(void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL) wait;方法传递主线程[NSThread mainThread]) [NSOperationQueue mainQueue] addOperationWithBlock: dispatch_sync(dispatch_get_main_queue(), ^{}) 3> NSThread适合轻量级多线程开发,控制线程顺序比较难,同时线程总数无法控制(每次创建并不能重用之前的线程,只能创建一个新的线程)。 4> 对于简单的多线程开发建议使用NSObject的扩展方法完成,而不必使用NSThread。 5> 可以使用NSThread的currentThread方法取得当前线程

iOS多线程编程技术NSThread; NSOperation、GCD三者使用详解

两盒软妹~` 提交于 2020-03-01 14:35:03
三种方式的优缺点介绍: 1)NSThread 优点: NSThread 比其他两个轻量级 缺点: 需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销 2)Cocoa NSOperation 优点: 不需要关心线程管理, 数据同步的事情,可以把精力放在自己需要执行的操作上。 Cocoa operation相关的类是NSOperation, NSOperationQueue. NSOperation是个抽象类,使用它必须用它的子类,可以实现它或者使用它定义好的两个子类: NSInvocationOperation和NSBlockOperation. 创建NSOperation子类的对象,把对象添加到NSOperationQueue队列里执行。 3) GCD (全优点) Grand Central dispatch(GCD)是Apple开发的一个多核编程的解决方案。在iOS4.0开始之后才能使用。GCD是一个替代NSThread, NSOperationQueue,NSInvocationOperation等技术的很高效强大的技术。 下面我用简单易于理解的代码实例来介绍NSThread在开发实践中的使用,具体使用时可以根据实际情况进行扩展: 一、NSThread的使用(基本已过时) [html] view plain copy #import < UIKit

架构师必备之面试题整理——多线程并发技术要点!

怎甘沉沦 提交于 2020-02-26 22:04:08
一、概念 什么是线程 一个线程要执行任务,必须得有线程 一个进程(程序)的所有任务都在线程中执行的 一个线程执行任务是串行的,也就是说一个线程,同一时间内,只能执行一个任务 多线程原理 同一时间,CPU只能处理1条线程,只有一条线程在工作(执行) 多线程并发(同时)执行,其实质是CPU快速的在多线程之间调度(切换) 如果线程过多,会怎样? CPU在N多条线程中调度,会消耗大量的cpu资源 每条线程被调度执行的频率越低(线程的执行效率低) 多线程的优点 能适当提高程序的执行效率 能适当提高资源的利用率(CPU 内存利用率等) 多线程的缺点 创建线程是有开销的,iOS下主要成本包括:内核数据结构(大约1KB)、栈空间(子线程512KB、主线程1MB,也可以使用-setStackSize:设置,但必须是4K的倍数,而且最小是16K),创建线程大约需要90毫秒的创建时间 如果开启大量的线程,会降低程序的性能 程序越多CPU的线程上的开销就越大 程序设计更加复杂:线程之间的通讯,多线程的数据共享 主线程的主要作用 显示和刷新UI界面 处理UI事件(比如点击事件,滚动事件,拖拽事件等) 主线程的使用注意 别将比较耗时的操作放在主线程中,会导致UI界面的卡顿 将耗时操作放在子线程(后台线程,非主线程) 二、多线程的4种方案 三、常见多线程面试题:

多线程

时光怂恿深爱的人放手 提交于 2020-02-18 22:24:34
多线程 基础 进程 n什么是进程 p进程是指在系统中正在运行的一个应用程序 p每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 p n比如同时打开QQ、Xcode,系统就会分别启动2个进程 n n n n n n n n通过“活动监视器”可以查看Mac系统中所开启的进程 线程 n什么是线程 p1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) p线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 p 比如使用酷狗播放音乐、使用迅雷下载电影,都需要在线程中执行 线程的串行 n1个线程中任务的执行是串行的 p如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务 p也就是说,在同一时间内,1个线程只能执行1个任务 p 比如在1个线程中下载3个文件(分别是文件A、文件B、文件C) p 多线程 n什么是多线程 p1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务 p进程 à 车间,线程 à 车间工人 p多线程技术可以提高程序的执行效率 p 比如同时开启3条线程分别下载3个文件(分别是文件A、文件B、文件C) 多线程的原理 多线程的原理 p同一时间,CPU只能处理1条线程,只有1条线程在工作(执行) p多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换) p如果CPU调度线程的时间足够快

进程和线程

隐身守侯 提交于 2020-02-18 22:24:10
1.什么是进程? 进程是指在系统中正在运行的一个应用程序。 每个进程之间都是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ、Xcode,系统就会分割启动2个进程,通过“活动监听视器”可以查看MAC系统中所开启的进程 2.什么是线程? 1个进程要想执行任务,必须得有线程(每一个进程至少有1条线程) 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 比如使用酷狗音乐播放器,使用迅雷下载电影,都西药在线程中执行 3.线程的串行 1个线程中任务的执行时串行的 如果在一个线程执行多个任务,那么只能一个一个地按顺序执行这些任务 也就是说,在一个同时间内,一个线程只能执行一个任务 比如在一个线程中下载三个文件(分别是文件A文件B文件C) 多线程 1.什么是多线程 一个进程中开启多条线程,每天线程可以并行(同时)执行不同的任务 进程->车间->车间工人 多线程技术可以提高程序的执行效率 比如同时开启3条线程分别下载3个文件(分别是文件A,文件B,文件C) 2.多线程的原理 同一时间,CPU只能处理1条线程,只要1条线程在工作(执行) 多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换) 如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象 思考:如果线程非常非常非常多,会发生什么情况? CPU会在N多线程之间调度,CPU会累死

iOS之多线程

痞子三分冷 提交于 2020-02-10 00:29:07
首先,在了解多线程之前要了解什么是进程,什么是线程 进程是指在系统中正在运行的一个应用程序。每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内。 一个进程要想执行任务,必须得有至少一个线程,线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行。 一个线程中任务的执行是串行的,如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务。也就是说,在同一时间内,1个线程只能执行1个任务。 什么是多线程? 即在一个进程(程序)中可以开启多条线程,每条线程可以并行(同时)执行不同的任务。 并行即同时执行。比如同时开启3条线程分别下载3个文件(分别是文件A、文件B、文件C)。 在同一时间里,CPU只能处理一条线程,只有一条线程在工作(执行)。多线程并发(同时)执行,其实是CPU快速地在多条线程之间快速切换,如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象。 多线程优缺点 优点: 能适当提高程序的执行效率。 能适当提高资源利用率(CPU、内存利用率) 缺点: 开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能。 线程越多,CPU在调度线程上的开销就越大。 程序设计更加复杂:比如线程之间的通信、多线程的数据共享 开启多线程的方式 当一个iOS程序运行后

iOS 多线程相关 线程组

别说谁变了你拦得住时间么 提交于 2020-02-06 16:58:25
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ dispatch_queue_t queue = dispatch_get_global_queue(0, 0); dispatch_async(queue, ^{ NSLog(@"1"); //这句话的本质是往runloop中添加定时器 [self performSelector:@selector(test) withObject:nil afterDelay:.0]; NSLog(@"3"); //若不启动runloop 子线程中是不会执行定时器的 打印结果为 1 3 执行了 打印结果为 1 3 2 [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; }); } -(void)test{ NSLog(@"2"); } - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ NSThread *thred = [[NSThread alloc]initWithBlock:^{ NSLog(@"1")