iOS 多线程知识总结 GCD基础知识

进程的基本概念:

1.每一个进程都是一个一个应用程序,都有独立的内存空间,一般来说一个应用程序存在一个进程存在一个进程,但也有多个进程的情况。

2.同一个进程中的线程共享内存中内存中资源。

多线程的基本概念:

1.每一个程序都有一个主线程,程序启动时创建(调用main函数来启动)

2.主线程的生命周期是和其他应用程序绑定的,程序退出时,主线程也就停止了。

3.多线程技术表示,一个应用程序有多个线程,使用多线程能提高CPU的使用效率,防止线程阻塞

4.任何有可能阻塞主线程的任务不要在主线程中执行(例如访问网络)

线程使用不是无节制的:

1.iOS中的主线程的堆栈大小是1M

2.从第二个线程开始都是512KB

3.以上这些数值不能通过编译器开关或者线程api函数更改

只有主线程有直接修改UI的能力。

iOS的三种多线程技术:

1.NSThread每个NSThread对象对应一个线程,轻量级。

2NSOperation/NSOperationQueue面向对象的线程技术。

3.GCD——Grand Central Dispatch 是基于C语言的框架,可以充分利用多核,也是苹果官方推荐使用的多线程技术。

三种多线程技术的对比:

1.NSThread:优点:NSThread比其他俩个轻量级,使用简单。

缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销

2.NSOpertion:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上。NSOpertion是面向对象的。

3.GCD:GCD是由苹果开发的一个多核编程的解决方案。iOS4.0+才能使用,是替代NSThread,NSOperation的高效和强大的技术,GCD是基于C语言的

GCD是苹果公司为多核的并行运算提出的解决方案

GCD会自动利用更多的CPU内核(比如双核、四核)

GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)

程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码

GCD中有两个核心概念:

(1)任务:执行什么操作

(2)队列:存放任务

 

队列:

1.串行队列:添加到队列中的任务是一个一个执行的
 
 2.并行(发)队列:添加到队列中的任务是多个同时执行的
 
 3.主队列:里面的任务都是在主线程执行的,可以理解为主队列就是串行队列的一种
 
 4.全局队列:并行(发)队列

同步、异步:

1、同步:需要后面的任务等待,不会开启新的线程,会直接使用当前的线程

2、异步:不需要后面的任务等待,会开启新的线程

(1)用同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

参数说明:

queue:队列

block:任务

(2)用异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

3.同步和异步的区别

同步:在当前线程中执行

异步:在另一条线程中执行

说明:

同步函数不具备开启线程的能力,无论是什么队列都不会开启线程;异步函数具备开启线程的能力,开启几条线程由队列决定(串行队列只会开启一条新的线程,并发队列会开启多条线程)。

同步函数

(1)并发队列:不会开线程

(2)串行队列:不会开线程

异步函数

(1)并发队列:能开启N条线程

(2)串行队列:开启1条线程

凡是函数中,各种函数名中带有create\copy\new\retain等字眼,都需要在不需要使用这个数据的时候进行release。

GCD的数据类型在ARC的环境下不需要再做release。

CF(core Foundation)的数据类型在ARC环境下还是需要做release。

异步函数具备开线程的能力,但不一定会开线程

时间: 2024-10-11 03:22:25

iOS 多线程知识总结 GCD基础知识的相关文章

iOS多线程开发之GCD(下篇)

上篇和中篇讲解了什么是GCD,如何使用GCD,这篇文章将讲解使用GCD中将遇到的死锁问题.有兴趣的朋友可以回顾<iOS多线程开发之GCD(上篇)>和<iOS多线程开发之GCD(中篇)>. 言归正传,我们首先来回顾下死锁,所谓死锁: 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源(如数据源,内存等,变量不是资源)而造成的一种互相等待的现象,若无外部处理作用,它们都将无限等待下去. 死锁形成的原因: 系统资源不足 进程(线程)推进的顺序不恰当: 资源分配不当 死锁形成的条件:

IOS Socket 01-网络协议基础知识

1. 网络参考模型 OSI参考模型                                          TCP/IP参考模型 2. 七层简述 1)物理层:主要定义物理设备标准,如网线的接口类型.各种传输介质的传输速率等.主要作用是传输比特流(就是由1.0转化为电流强弱来进行传输,到达目的地后再转化为1.0,也就是常说的数模与模数转换).这一层的数据叫做比特(bit),主要设备:集线器 2)数据链路层:主要将从物理层接收的数据进行MAC地址的封装与解封装.常把这一层的数据叫做帧,主要

李洪强iOS开发之OC语言基础知识

OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能的类. 术语:OO面向对象.OOP面向对象编程   二.类 (一)关于类 类的设计只关注三个东西:类名.属性和方法 注意:一般名词都是类,拥有相同属性和行为的对象都可以抽象为一个类,类名是标识符的一种,需要符合规范,通常类名的第一个字母大写,且不能有下划线,如果有多个单词则使用驼峰标识.在对方法进行

iOS 多线程:『GCD』详尽总结

本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法.这大概是史上最详细.清晰的关于 GCD 的详细讲解+总结的文章了.通过本文,您将了解到: 1. GCD 简介 2. GCD 任务和队列 3. GCD 的使用步骤 4. GCD 的基本使用(6种不同组合区别) 5. GCD 线程间的通信 6. GCD 的其他方法(栅栏方法:dispatch_barrier_async.延时执行方法:dispatch_after.一次性代码(只执行一次):dispatch_once.快速迭代方法:dis

iOS 多线程学习笔记 —— GCD

本文复制.参考自文章:iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用 ,主要为了加强个人对知识的理解和记忆,不做他用.原作者声明: 著作权声明:本文由http://blog.csdn.net/totogo2010/原创,欢迎转载分享.请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢! 这里对原作者的辛勤工作表示感谢! 1. 简介 GCD (Grand Central Dispatch) 是建立任务并行执行的线程池模式的基础上的,以优化支持多核.多处理器系统

学习Spring必学的Java基础知识(7)----事务基础知识

引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.): [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http://www.iteye.com/topic/1123293 [3] 属性

【基础知识】环形变压器基础知识及问答(1)

一.电源变压器的基本参数: 1.额定功率:是指变压器工作时的最大负载功率,是在规定的频率和电压下,变压器长期工作,而不超过规定温升的输出功率. 2.额定电压:指在变压器的线圈上所允许施加的电压,工作时不得大于规定值. 3.电压比:指变压器初级电压和次级电压的比值,有空载电压比和负载电压比的区别,空载是指变压器没有接任何电器时的状态,负载是指通电时变压器有连接电器使用的状态,空载电压都会比负载电压大. 4.工作频率:变压器铁芯损耗与频率关系很大,所以应根据使用频率来设计和使用,这种频率称工作频率.

GCD基础知识

并行和并发 在英文世界里,「并行」和「并发」的区别比较清晰,「并行」对应parallelism,「并发」对应concurrency:但在中文世界里二者仅一字之差,两个概念非常容易弄混淆: 各种资料对「并行」和「并发」有各种各样的解释和比喻.我比较喜欢的一种是播客节目内核恐慌中的主播Rio的描述,大概意思是: 「并发」和「并行」是一种计算模型,使得计算机能够在同一时间处理多个任务:「并发」表示逻辑概念上的「同时」,「并行」表示物理概念上的「同时」. 简单来说,若说两个任务A和B并发执行,则表示任务

java核心-多线程(4)-线程类基础知识

1.并发 <1>使用并发的一个重要原因是提高执行效率.由于I/O等情况阻塞,单个任务并不能充分利用CPU时间.所以在单处理器的机器上也应该使用并发. <2>为了实现并发,操作系统层面提供了.但是进程的数量和开销都有限制,并且多个进程之间的数据共享比较麻烦.另一种比较轻量的并发实现是使用线程,一个进程可以包含多个线程.线程在进程中没有数量限制, 数据共享相对简单.线程的支持跟语言是有关系的.Java 语言中支持多线程. <3>Java 中的多线程是抢占式的.这意味着一个任