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
原创粉丝点击