码迷,mamicode.com
首页 > 编程语言 > 详细

多线程一些理解

时间:2016-08-09 22:10:50      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:

iOS多线程几种实现方案

1.pthread .   C语言但是使用难度大,用于Windows,Linux等平台,几乎不用

2.NSThread       OC 简单易用,直接操作线程对象,但是偶尔使用。

3.GCD    C语言  是为了替代NSThread等线程计数,充分利用设备多核,自动管理所以经常使用。

4.NSOperation   OC语言,基于GCD 自动管理,所以也是经常使用。

 

1.在pthread中要实现它的子线程,导入<pthread.h>,pthread_t thread;pthread_create($thread,NULL,函数名,NULL);实现函数方法,比如void * run(void *param){for 循环一下,return NULL;}

2.NSThread  

首先是创建线程 

- (void)viewDidLoad {
    [super viewDidLoad];
    NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(run:) object:nil];
    [thread start];
}
-(void)run:(NSString *)param{
    for (int i=0; i<10000; i++) {
        NSLog(@"%@--%@",param,[NSThread currentThread].name);
    }
}

启动线程

还有一种创建线程的方式

[self performSelectorInBackground:(nonnull SEL) withObject:(nullable id)] 

[self performSelectorOnMainThread:(nonnull SEL) withObject:(nullable id) waitUntilDone:(BOOL)]

以上都不是很完美的方式

/*******************************************************/

3.GCD


全称:Grand Central Dispatch  牛逼的中枢调度器

为多核并行解决方案,自动利用CPU内核。自动管理生命周期,不需要编写任何线程管理代码

两个核心概念:任务和队列

两个步骤:定制任务和添加任务

  //异步 具备开启新线程的能力
    dispatch_async(dispatch_queue_t queue, ^{
        code
    })
    //同
    dispatch_sync(dispatch_queue_t queue, ^{
        code
    })

queue 队列   block 任务

GCD队列的两大类型

并发队列 只有在异步才有效,多个任务并发执行

串行队列  一个任务完成后,才开始执行下一个任务

创建并发队列

dispatch_queue_t queue = dispatch_queue_create(const char *label, dispatch_queue_attr_t attr)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

多线程安全隐患

1.多个线程可能会访问同一块资源。比如多个线程访问同一个对象,同一个变量和文件。想象存钱和取钱的例子。会覆盖之前的数据,无法实时更新提示。

2.解决方案就是加一把锁。互斥锁。等一个线程访问完毕后就解除锁。@synchronized(锁对象self)但是它会消耗大量CPU资源。不建议使用

 

原子核非原子属性

nonatomic

非线程安全,适合内存小的移动设备,所以所有的属性声明都是nonatomic

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

atomic

 原子属性 为setter方法,需要消耗大量资源

 

线程之间的通信

一个进程中,线程不是孤立 的,多个线程之间需要通信,比如在主线程中我们添加UI控件,图片等,在子线程中下载图片,下载完毕之后,要在主线程中显示图片

多线程一些理解

标签:

原文地址:http://www.cnblogs.com/MrXiaoWan/p/5754618.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!