一、基本内容介绍:

进程:
     正在运行的程序就叫进程
     每个进程之间是相互独立的,每个进程均运行在其专用且受保护的内存空间内。
线程:
     在程序内工作的基本执行单元(每个进程至少有1条线程)
线程的串行:
     1个线程中人物的执行是串行(顺序执行)的
     如果要在一个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务,也就是说,在同一时间内,一个线程只能执行一个任务。
主线程:
     一个IOS程序运行后,默认会开启一条线程,称为“主线程”或“UI线程”
     作用:
          显示\刷新UI界面
          处理UI事件(比如点击事件、滚动事件、拖拽事件等)
     使用注意:
          1.别将比较耗时的操作放到主线程中
          2.耗时操作会卡住主线程、严重影响UI的流畅度,给用户一种卡的坏体验;
     在OC中,只要有@“”定义的字符串,如果内容一样。大家的地址都一样
多线程:
     1个进程中可以开启多条线程,每条线程可以并发(同时)执行不同的任务(并行);
     原理:
          1.同一时间,CPU只能处理一条线程,只有1条线程在工作(执行),
          2.多线程并发(同时)执行,其实是CPU快速的在多条线程之间的调度(切换)。
          3.如果CPU调度线程足够快,就会造成了多线程并发的家乡。
     优点:
          能适当提高程序的效率
          能适当提高资源利用率(CPU、内存利用率)
     缺点:
          开启线程需要占用一定的内存空间(默认情况下,每一条线程都占用512K)如果开启大量的线程,会占用大量的内存空间,降低程序的性能
          线程越多,CPU在调度线程上的开销就越大
          程序设计更复杂:比如线程之间的通讯,多线程的数据共享
     最主要的目的:就是将后台操作,放在后台;
     栈区操作效率比堆区快
     程序员只要管理堆区的内容

二、线程分类:

1、pthread:

  1)到入头文件: #import <pthread.h>

  

// 创建线程,并且在线程中执行 demo 函数
- (void)pthreadDemo { /**
参数:
1> 指向线程标识符的指针,C 语言中类型的结尾通常 _t/Ref,而且不需要使用 *
2> 用来设置线程属性
3> 线程运行函数的起始地址
4> 运行函数的参数 返回值:
- 若线程创建成功,则返回0
- 若线程创建失败,则返回出错编号 */
pthread_t threadId = NULL;
NSString *str = @"Hello Pthread";
int result = pthread_create(&threadId, NULL, demo, (__bridge void *)(str)); if (result == 0) {
NSLog(@"创建线程 OK");
} else {
NSLog(@"创建线程失败 %d", result);
}
}
// 后台线程调用函数
void *demo(void *params) {
NSString *str = (__bridge NSString *)(params); NSLog(@"%@ - %@", [NSThread currentThread], str); return NULL;
}
注:
‘桥接’__bridge 是ARC开发时,用于OC对象和C语言对象转换时的标记
ARC开发的时候,编译器会很据代码的结构,自动添加retain/release/autorelease
ARC不负责C语言的内存管理,如果碰到C语言的框架,如果出现retain/copy/new...需要程序员自己release
在OC对象和C语言的指针进行转换的时候,需要使用__bridge,表示什么特殊处理都不做;
__bridge可以用Xcode智能提示
MRC 中不需要__bridge 因为MRC中所有内存都是程序员管理的

2、NSThread

  1.创建方式:

    (1)NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(longOperation:) object:@"THREAD"];
       [thread start];//方式1需要手动启动
    (2)
[NSThread detachNewThreadSelector:@selector(longOperation:) toTarget:self withObject:@"DETACH"];
    (3)
[self performSelectorInBackground:@selector(longOperation:) withObject:@"PERFORM"];

  2.线程状态:

    

  代码演示:

  

    注意:不要在主线程用exit

  3.线程属性

    1.name 线程名称:通常需要在程序崩溃时,获取程序准确执行所在的线程

    2.threadPriority 线程的优先级 优先级范围为0-1.0, 默认是0.5  建议不要使用优先级。避免程序出错;

      >优先级只能保证CPU调度的可能性高,不见得会先调用;

      >多线程的目的是:将耗时的操作放在后台。避免影响用户的交互和阻塞主线程

      >开发原则:简单

    3.stackSize  栈区大小: 无论主线程还是子线程,大小都是512k 设置线程大小必须是4的整数倍。最小为8k

    4.isMainThread 是否为主线程  

  4.互斥锁

    

  互斥锁:

    1.保证锁内的代码,同一时间,只有一条线程能够执行!

    2.互斥锁的锁定范围,应该尽量小,锁定范围越大,效率越差!(最好只包含读写操作)

    3.能够加锁的任意 NSObject 对象

    4.如果代码中只有一个地方需要加锁,大多都使用 self,这样可以避免单独再创建一个锁对象

    5.注意:锁对象一定要保证所有的线程都能够访问

  5、自旋锁

  自旋锁和互斥锁

    相同点:能够保证同一时间,只有一条线程执行锁定范围的代码;

    不同点:

      互斥锁:如果发现有其他线程正在执行锁定的代码,线程会进入休眠状态,等待其他线程执行完毕,打开锁之后,线程会被唤醒

      自旋锁:如果发现有其他线程正在执行锁定的代码,线程会以死循环的方式,一直等待锁定代码执行完成(适合简短的代码)

  主线程又被称为UI 线程

  开发建议:

    所有属性都声明为 nonatomic

    尽量避免多线程抢夺同一块资源

    尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力

  6、线程间的通讯

  在后台线程下载图像

    [self performSelectorInBackground:@selector(方法名) withObject:nil];

  在主线程设置图像

    [self performSelectorOnMainThread:@selector(方法名) withObject: waitUntilDone:NO];

  

多线程 1-pthread 和NSThread的更多相关文章

  1. 多线程相关(pthread 、NSThread 、GCD、NSOperation)

    进程 进程是指在系统中正在运行的一个应用程序 线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 1个线程中任务的执行是串行的(执行完上一个才能执行下一个) 多线程 1个进程中可以 ...

  2. iOS---多线程实现方案一 (pthread、NSThread)

    在iOS开发中,多线程是我们在开发中经常使用的一门技术.那么本文章将和大家探讨一下针对于多线程的技术实现.本文主要分为如下几个部分: iOS开发中实现多线程的方式 单线程 pthread NSThre ...

  3. 转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解

    Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解   多线程c语言linuxsemaphore条件变量 (本文的读者定位是了解Pthread常用多线程API和Pthread互斥锁 ...

  4. Objective-c——多线程开发第一天(pthread/NSThread)

    一.为什么要使用多线程? 1.循环模拟耗时任务 1.同步执行 2.异步执行 (香烟编程小秘书) 3.进程 系统中正在运行的一个应用程序 每个进程之间是独立的, 均运行在其专用的且受保护的内存空间 通过 ...

  5. 多线程 - pthread、NSThread

    1. pthread pthread 简单介绍下,pthread是一套通用的多线程的API,可以Unix / Linux / Windows 等徐彤跨平台使用,使用C语言编写,需要程序员自己管理线程的 ...

  6. 多线程(pthread、NSThread、GCD)

    pthread C语言编写 跨平台可移植 线程生命周期需要我们来管理 使用困难 NSThread 面向对象的 可直接操作线程对象 线程生命周期需要我们来管理 使用简单 资源互斥(@synchroniz ...

  7. 多线程(一)NSThread

    iOS中多线程的实现方案: 技术 语言 线程生命周期 使用频率 pthread C 程序员自行管理 几乎不用 NSthread OC 程序员自行管理 偶尔使用 GCD C 自动管理 经常使用 NSOp ...

  8. OC - 19.pthread和NSThread

    简介 恰当的使用多线程编程可以提供任务的执行效率和系统资源的利用率 多线程是为了提高资源利用率,和应用程序的响应速度,多个线程共享应用资源 每个应用程序都有一个主线程,通常用来做UI界面刷新等 比较耗 ...

  9. 【学习总结】【多线程】 线程 & 进程 & NSThread(多线程的一套API)

    一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开 Chrome.Xcode,系统就会分别启动2个进 ...

  10. iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD

    原文出处: 容芳志的博客 简介iOS有三种多线程编程的技术,分别是:(一)NSThread(二)Cocoa NSOperation(三)GCD(全称:Grand Central Dispatch) 这 ...

随机推荐

  1. HTML中的英文缩写标记、属性

      我们知道是表示一个空格,因为在HTML中手动敲多个空格浏览器会认为是一个空格,具体的英文全称:Non Breaking Spacing 不间断空格

  2. sql时间格式

    取值后格式化 {:d}小型:如2005 {:D}大型:如2005年5月6日 {:f}完整型 当前时间获取 DateTime.Now.ToShortDateString 取值中格式化 SQL Serve ...

  3. SQL里IN的用法以及优化

    1.in后条件不多,可以考虑主表建索引,或用union all 代替 2. in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查 ...

  4. SQL Server2000安装

    本篇文章介绍了安装SQL Server 2000各版本的软硬件配置要求,企业版安装过程的详细步骤,以及需要注意的事项.其他版本可以参考安装 注意:Windows XP不能装企业版.win2000\wi ...

  5. 查询sql 并且读取

    //显示地址 //VBSBegin // Set obj = GetObject("winmgmts:\\.\root\cimv2") // Set IPConfigSet = o ...

  6. WIN7实用的运行命令

    运行命令主要是DOS操作系统的运行方式.为方便用户的操作,微软公司将一些常用的命令,如DIR,CD等命令全部集成在系统里面:存放这些内部命令的文件是“Command”(文件后缀.com).它与IO.s ...

  7. centos7没有安装ifconfig命令的解决方法

    ifconfig命令是设置或显示网络接口的程序,可以显示出我们机器的网卡信息,可是有些时候最小化安装CentOS等Linux发行版的时候会默认不安装ifconfig等命令,这时候你进入终端,运行ifc ...

  8. 【学习笔记】【C语言】指向结构体的指针

    1.指向结构体的指针的定义 struct Student *p;  2.利用指针访问结构体的成员 1> (*p).成员名称 2> p->成员名称 3.代码 #include < ...

  9. 7款震撼人心的HTML5CSS3文字特效

    1.HTML5像素文字爆炸重组动画特效 今天我们要分享一款基于HTML5技术的文字像素爆炸重组动画特效,我们可以在输入框中指定任意文字,点击确定按钮后,就会将原先的文字爆炸散去,新的文字以像素点的形式 ...

  10. (转载)浅谈我对DDD领域驱动设计的理解

    原文地址:http://www.cnblogs.com/netfocus/p/5548025.html 从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来 ...