IOS多线程 pThread NSThread 线程安全 个人笔记(一)
来源:互联网 发布:linux oracle 11g下载 编辑:程序博客网 时间:2024/06/05 07:45
1、进程,线程和应用程序之间的关系
2 、为什么要使用多线程技术
多线程技术的好处:
能够充分利用CPU资源,提高效率
避免因为耗时操作造成的主线程等待。
缺点:
如果开辟了较多的线程,会占用系统资源。会降低每个线程的执行效率。每个线程的执行时间会变长.
合理的线程数 应该控制在 3-6 条
首先 介绍IOS 多线程 当中 使用C语言的函数 开启多线程
PThread C语言多线程函数
/* 参数1:线程的编号 参数2:线程的属性 nil null 参数3:要调用的函数 void* (*) (void *) 函数的返回值是 void * (*)代表函数名 (void *) 代表参数 参数4:给要调用的函数传递的参数 (参数可以传递) */ pthread_t ID; int result = pthread_create(&ID, NULL, demo, NULL); //返回值为0的话就代表成功 其他的都代表失败 if (result == 0) { NSLog(@"成功"); }else { NSLog(@"失败"); }//要调用的函数void * (demo)(void *param){ NSLog(@"%@",[NSThread currentThread]); return NULL;}
NSThread OC的类,可用于开辟多线程
三种使用NSThread 创建线程的方式
/* 参数1:调用的方法所属的对象 参数2:调用的方法 参数3:给调用的方法传递的参数 */ //方式1 需要 使用start 的方式开启线程 NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(demo) object:nil]; [thread start]; //方式2 直接开启线程 [NSThread detachNewThreadSelector:@selector(demo) toTarget:self withObject:nil]; //方式3 [self performSelectorInBackground:@selector(demo) withObject:nil];
<p class="p1"><span class="s1">//</span><span class="s2">有参数的方法</span></p><p class="p2"><span class="s2">- (</span><span class="s3">void</span><span class="s2">)demo:(</span><span class="s4">NSString</span><span class="s2"> *)str</span></p><p class="p2"><span class="s2">{</span></p><p class="p3"><span class="s5"> </span><span class="s2">NSLog</span><span class="s5">(</span><span class="s6">@"%@ %@"</span><span class="s5">,str,[</span><span class="s4">NSThread</span><span class="s5"> </span><span class="s2">currentThread</span><span class="s5">]);</span></p><p class="p2"><span class="s2">}</span></p><p class="p4"><span class="s2"></span></p><p class="p1"><span class="s1">//</span><span class="s2">没有参数的方法</span></p><p class="p2"><span class="s2">- (</span><span class="s3">void</span><span class="s2">)demo</span></p><p class="p2"><span class="s2">{</span></p><p class="p3"><span class="s5"> </span><span class="s2">NSLog</span><span class="s5">(</span><span class="s6">@"%@"</span><span class="s5">,[</span><span class="s4">NSThread</span><span class="s5"> </span><span class="s2">currentThread</span><span class="s5">]);</span></p><p class="p2"><span class="s2">}</span></p>
NSThread 的一些其他属性
//获取主线程占用的内存大小 NSLog(@"touchesBegan %zd",[NSThread currentThread].stackSize/1024); //创建线程 NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(demo) object:nil]; //设置线程名称 用于调试 thread.name = @"mythread"; //设置线程的优先级 0 - 1值越大优先级越高,值越小优先级越低,默认为0.5 [thread setThreadPriority:1.0]; [thread start]; //创建线程 NSThread *thread2 = [[NSThread alloc]initWithTarget:self selector:@selector(demo) object:nil]; //设置线程名称 用于调试 thread2.name = @"test"; //设置线程的优先级 [thread2 setThreadPriority:0]; [thread2 start]; //设置优先级并不能够绝对保证,线程优先执行 只能确定线程 1 的执行的频率会比线程 2 的执行频率高
多线程当中访问共享资源
案例:售票
假设一辆火车的票数是有限的,需要开启多个窗口共同售票(线程) 如何能保证线程之间不会争抢资源。
解决方案:互斥锁
@interface ViewController ()//总票数@property (nonatomic, assign) int totalTickets;@property (nonatomic, strong) NSObject *obj;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; //给总票数赋值 self.totalTickets = 10; self.obj = [NSObject new];}- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //窗口1 NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(saleTickets) object:nil]; [thread start]; //窗口2 NSThread *thread2 = [[NSThread alloc]initWithTarget:self selector:@selector(saleTickets) object:nil]; [thread2 start];}//卖票- (void)saleTickets{ while (YES) { /* 加锁(互斥锁)@synchronized(锁对象){} 锁对象的条件:1:必须继承NSObject 2:必须是全局的 */// NSObject *obj = [NSObject new]; //加锁 @synchronized(self) { //判断剩余的票数 if (self.totalTickets > 0) { self.totalTickets = self.totalTickets - 1; NSLog(@"剩余%d张票",self.totalTickets); }else{ NSLog(@"票卖完了"); break; } } }}@end
原子属性
互斥锁和自旋锁
0 0
- IOS多线程 pThread NSThread 线程安全 个人笔记(一)
- iOS多线程之Pthread/NSthread
- iOS多线程之Pthread/NSthread
- iOS多线程之Pthread/NSthread
- IOS 中的多线程网络(一)总览及pthread、NSThread
- IOS 多线程 线程NSThread
- IOS 多线程 线程NSThread
- 多线程(一) 基本概念,pthread,NSThread
- iOS多线程--彻底学会多线程之『pthread、NSThread』
- iOS多线程--彻底学会多线程之『pthread、NSThread』
- iOS多线程编程(一)NSThread
- iOS 多线程(一)NSThread
- IOS 多线程初探(一) - NSThread
- iOS中多线程的实现方案之pthread和NSThread
- iOS中的多线程技之Pthread和NSThread
- iOS多线程(二) 实现方案上(pthread,NSThread介绍)
- iOS-多线程之Pthread、NSThread实例和理解
- iOS之多线程——概念、pthread、NSThread、GCD
- SDWebimage的缓存机制
- HDU 1847 Good Luck in CET-4 Everybody!
- PAT1042字符统计
- 认识数据库系统
- UITableView性能优化
- IOS多线程 pThread NSThread 线程安全 个人笔记(一)
- VBA中将数字列转换成字母的方法
- 密码破解,N位随机序列数的生成
- BestCoder #74 B (div2)
- Linux下删除已创建用户
- 敏感词汇过滤DFA算法
- js、css的动态引入
- vba将列名的字母转为数字
- 网易2016研发题 [编程题] 小易的升级之路