iOS 关于多线程的一些基本概念
一 什么是进程
进程是在系统中正在运行的应用程序!普通的应用程序并不是进程,只有正在运行的应用程序才是一个进程,
在系统中每个进程之间是相互独立的,每个进程均在其专享的且受保护的内存空间内。但是一个应用程序可以对用多个进程,比如 你可以在MAC上打开两个QQ。
二 什么是线程
一个进程想要执行任务 必须得有进程(每一个进程至少包含一个线程)
一个进程(程序)的所有任务 都在线程中完成。
2.1 线程的串行
线程里面任务的执行顺序是串行的,就是一个线程中执行任务时有顺序的,一个接一个的,如果一个线程中有多个任务,这些任务是一个接一个完成的,在同一时间内 一个线程只能执行一个任务.也可以说线程是进程中的一个执行路径。
2.2 进程和线程的关系
线程是CPU调用(执行任务)的最小单位
进程是CPU分配资源和调度单位 (CPU 调度进程 进程调用线程执行任务)
一个程序可以对应多个进程,一个进程至少包含一个线程
同一个进程內的线程共享进程的资源
三 多线程
一个进程中可以开启多个线程,每条线程可以并行(同时)执行不同的任务(但是每条线程执行任务时串行的)
3.1 多线程的原理
在同一时间内CPU职能处理一条线程,只有一条线程在工作
多线程并发(同时)执行,其实是CPU快速在多条线程之间的调度(切换)
上面的理论只存在在单CPU之间
如果CPU调度线程的时间足够快就会造成多线程并发的假象.
所以并不是开辟越多的线程就越好,因为CPU在调度线程的时候也会消耗资源(比如保存上下文 即每条线程执行任务的进度节点) 通常我们在开发中会开3-5条线程
3.2多线程的优缺点
优点
1.可以适当的提高程序的执行效率
2.能适当的提高资源利用率(CPU,内存利用率)
缺点
创建多线程是有开销的,在ISO下主要成本包括,内核数据结构(大约1KB) 栈空间(自线程512KB 注线程1MB,也可以通过setStackSize: 来设置,但必须是4K的倍数,而且最小是16K)创建线程大约需要90毫秒的创建时间.
如果开启大量的线程 会降低程序的性能
线程越多,CPU在调度线程上的开销就会越大
线程设计更加复杂,比如线程之间的通信,多线程数据共享 等等
四 多线程在IOS中的应用
4.1 什么是主线程
一个iOS程序运行之后,默认会开启一条线程,这个线程就叫做主线程(UI线程)
主线程的主要任务是 显示、刷新UI界面 处理UI事件(点击事件 滚动事件 拖拽事件)
凡是跟UI相关的所有操作 必须在主线程之间运行 但是不要把耗时操作放到主线程之间
因为耗时操作会卡住主线程,给用户造成卡顿的感觉(因为线程中的任务是串行执行的,会等到耗时操作完成后才执行其他任务)
耗时操作的执行最好放在子线程中(后台线程,非主线程) 比如打印就是耗时操作
一些简单代码
- (void)viewDidLoad {
[super viewDidLoad];
//获取主线程
NSThread *mainThread = [NSThread mainThread];
//获取当前此案成
NSThread *currentThread = [NSThread currentThread];
NSLog(@"主线程 %@ 当前线程%@",mainThread,currentThread);
//判断是否为主线程
// 判断number == 1
//类方法
BOOL isMainThread = [NSThread isMainThread];
//对象方法
BOOL isMainThread1 = [currentThread isMainThread];
NSLog(@"%zd --- %zd",isMainThread,isMainThread1);
}
五 iOS中多线程的实现方案

六Pthread的简单实用
#import "ViewController.h"
#import <pthread.h> @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
[self openThreadByPthread];
}
- (void)openThreadByPthread {
pthread_t thread;
/*
*第一个参数:线程对象的地址
*第二个参数:线程的一些属性 不想传久NULL
*第三个参数:指向函数的指针
*第四个参数:函数需要接受的参数 不需要传NULL
*/
pthread_create(&thread, NULL, task, NULL); }
//多线程要执行的函数
void * _Nullable task(void * _Nullable params) {
NSLog(@"%@",[NSThread currentThread]);
return NULL;
}
iOS 关于多线程的一些基本概念的更多相关文章
- iOS中多线程知识总结(一)
这一段开发中一直在处理iOS多线程的问题,但是感觉知识太散了,所以就把iOS中多线程的知识点总结了一下. 1.基本概念 1)什么是进程?进程的特性是什么? 进程是指在系统中正在运行的一个应用程序. ...
- iOS开发多线程篇—GCD介绍
iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 G ...
- iOS - Threads 多线程
1.Threads 1.1 进程 进程是指在系统中正在运行的一个应用程序.每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开 QQ.Xcode,系统就会分别启动两个进程. ...
- iOS开发多线程--(NSOperation/Queue)
iOS实现多线程的方式有三种,分别是NSThread.NSOperation.GCD. 关于GCD,请阅读GCD深入浅出学习 简介 NSOperation封装了需要执行的操作和执行操作所需的数据,提供 ...
- iOS 开发--多线程
前面在<Bison眼中的iOS开发多线程是这样的(二)>一文中讲完了多线程的NSThread,不难发现这种方式的多线程实现起来非常的复杂,为了简化多线程的开发,iOS提供了GCD来实现多线 ...
- iOS开发——多线程OC篇&多线程详解
多线程详解 前面介绍了多线程的各种方式及其使用,这里补一点关于多线程的概念及相关技巧与使用,相信前面不懂的地方看了这里之后你就对多线程基本上没有什么问题了! 1——首先ios开发多线程中必须了解的概念 ...
- iOS开发--多线程
前面在<Bison眼中的iOS开发多线程是这样的(二)>一文中讲完了多线程的NSThread,不难发现这种方式的多线程实现起来非常的复杂,为了简化多线程的开发,iOS提供了GCD来实现多线 ...
- iOS之多线程浅谈
1)并发和并行的区别 在软件开发中不可避免的会遇到多线程的问题,在iOS客户端开发(或者.NET的winform或者wpf这样的cs程序)中就更不可避免的会用到多线程,在bs类型的web项目中要考虑一 ...
- iOS开发多线程篇—GCD简介
iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 G ...
随机推荐
- 提高PAAS安全性的一点尝试
云服务已经成为现代人生活的一部分.手机中的照片会自己主动同步到云中:你的邮件内容保存在云中.办公软件执行在云中:你的健康数据会实时上传到云中.你每天的生活轨迹消耗的卡路里也会上传到云中:云服务也会逐渐 ...
- 使用 curl() 函数实现不同站点之间注册用户的同步
一 需求 在A站点注册一个新用户,那么,在B站点也会被同时注册 二 思路 在A站点注册的同时,调用API接口实现在B站点也会被同时注册 三 实现 主要代码如下: function http_curl( ...
- 网易2016年研发project师编程题(2)
序 网易互联网的实习笔试立即就開始了,做几个练习题熟悉熟悉~嘿嘿~ 题目一: 小易的升级之路 小易常常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内 ...
- GuozhongCrawler系列教程 (2) CrawTaskBuilder具体解释
GuozhongCrawler是分层架构.要高速学习CrawlTask独立的配置多少要了解框架的源码.所以CrawTaskBuilder提供要更加扁平且易于理解的的方式创建CrawTask 方法具体资 ...
- 转:winform_webApiSelfHost及 OWIN WebAPI Service
winform_webApiSelfHost 窗本构造函数中添加以下代码: var baseAddress = ConfigurationManager.AppSettings["baseA ...
- Java实现XSS防御
XSS概述 跨站脚本攻击(Cross Site Scripting),缩写为XSS.恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行, ...
- AES中几种加密模式的区别:ECB、CBC、CFB、OFB、CTR
AES: aes是基于数据块的加密方式,也就是说,每次处理的数据时一块(16字节),当数据不是16字节的倍数时填充,这就是所谓的分组密码(区别于基于比特位的流密码),16字节是分组长度 分组加密的几种 ...
- Extjs中获取getEl获取undefined的问题
一定注意: getEl()方法只有在panel.show()之后才会有值.在hide()的时候没有该对象. 也就是说如果要操作Ext.dom.Element对象必须让对象先显示出来.
- Java并发编程(三)概念介绍
在构建稳健的并发程序时,必须正确使用线程和锁.但是这终归只是一些机制.要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的(Shared)和可变的(Mutable)状态的访问. 对 ...
- php 、asp、 java、 c#、 delphi之间的语言对照
PHP是一种跨平台的server端的嵌入式脚本语言.它大量地借用C,Java和Perl语言的语法, 并耦合PHP自己的特性,使WEB开发人员能够高速地写出动态产生页面. 它支持眼下绝大多数数据库. 另 ...