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

多线程-GCD学习笔记

时间:2016-01-03 17:22:56      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:

********************************* 基本概念 ***********************************

 

1. Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法,是苹果主推的多线程处理机制。在多核CPU的状态下,GCD的性能很高。

    它自动利用更多的CPU内核,管理线程生命周期,程序员不需要编写任何线程管理代码,只需要给定要让GCD执行的任务。

2. GCD是纯C语言的,GCD中的函数大多数以dispatch开头。

3. GCD存在于 libdispatch.dylib 库中,但不需要手动导入,默认包含。

4. GCD的两个核心概念:任务队列

    将任务添加到队列中,GCD会自动将队列中的任务取出,放到对应的线程中执行,遵行FIFO原则:先进先出,后进后出。

5. GCD一般和Block一起使用,在Block回调中处理程序操作。

 

****************************** GCD的三种调度队列 ******************************

首先需要明确4个术语的概念:

1. 异步(async):在另一条线路中执行,具备开启新线程的能力

2. 同步(sync):在当前线路执行,不具备开启新线程的能力

3. 并行(concurrent):自动开启多个线程让多个任务同时执行,并行功能只在异步条件下才有效

4. 串行(serial):一个任务执行完成才执行下一个

总而言之同步和异步决定要不要开启新的线程,并行和串行决定任务执行的方式。

 

GCD的三种调度队列

1. 运行在主线程的主队列Main queue,一般是执行和UI相关的任务比如更新UI的显示,通过dispatch_get_main_queue获取。

 

2. 并发队列global dispatch queue,一般是后台长时间执行的任务比如下载,默认提供,不需要创建,通过dispatch_get_global_queue获取。

1 dispatch_queue_t dispatch_get_global_queue(dispatch_queue_priority_t priority,unsigned long flags)
2 // dislatch_queue_t 表示返回的是一个队列
3 /* 第一个参数dispatch_queue_priority_t priority表示优先级,后面会使用默认优先级
4 DISPATCH_QUEUE_PRIORITY_DEFAULT */
5 // 第二个参数unsigned long flags是以后才会使用的,所以先传0
6 
7 // 用法
8 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
9 // 获得全局并发队列queue

 

3. 串行队列serial queues,获得串行有两种途径

1) 使用dispatch_queue_create函数创建串行队列

1 dispatch_queue_t  dispatch_queue_create(const char *label,  dispatch_queue_attr_t attr)
2 // 第一个参数是队列名称,第二个参数是队列属性,一般传NULL
3 
4 // 用法
5 dispatch_queue_t queue = dispatch_queue_create("blahblahblah",  NULL);
6 
7 //非ARC需要手动释放队列
8 //dispatch_release(queue);

 

2) 使用主队列(一种特殊的串行队列,GCD自带的在主线程中执行的队列)

1 dispatch_get_main_queue()
2 
3 // 用法
4 dispatch_queue_t queue = dispatch_get_main_queue();

 

********************************* 代码示例 **********************************

 

技术分享

 

1. 用异步函数向并发队列添加任务

// ViewController.m
 
#import <ViewController.h>

@interface ViewController()

@end

@implementation ViewController
-(void)viewDidLoad{
    [super viewDidLoad];
    //1. 获得全局并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
    //2. 添加任务到队列中
    dispatch_async(queue,^{
        NSLog(@"下载图片1----%@",[NSThread currentThread]);
    });
    dispatch_async(queue,^{
        NSLog(@"下载图片2----%@",[NSThread currentThread]);
    });
    dispatch_async(queue,^{
        NSLog(@"下载图片3----%@",[NSThread currentThread]);
    });
    NSLog(@"主线程----%@",[NSThread mainThread]);

}
@end

// 异步,并发,开启了3个子线程

 

2. 用异步函数向串行队列添加任务

// ViewController.m

#import <ViewController.h>

@interface ViewController()

@end

@implementation ViewController
-(void)viewDidLoad{
[super viewDidLoad]; NSLog(
@"主线程----%@",[NSThread mainThread]); dispatch_queue_t queue = diapatch_queue_create("BlahBlahBlah",NULL); dispatch_async(queue,^{ NSLog(@"下载图片1----%@",[NSThread currentThread]) }); dispatch_async(queue,^{ NSLog("下载图片2----%@",[NSThread currentThread]); }) diapatch_async(queue,^{ NSLog("下载图片3----%@",[NSThread currentThread]); }) // 释放队列 // dispatch_release(queue); ) // 异步,串行,只开启一条子线程,子线程的任务串行执行

 

3. 用同步函数向并发队列添加任务

 1 // ViewController.m
 2 
 3 #import <ViewController.h>
 4 
 5 @interface ViewController()
 6 
 7 @end
 8 
 9 @implementation ViewController
10 -(void)viewDidLoad{
11     [super viewDidLoad];
12     NSLog(@"主线程----%@",[NSThread mainThread]);
13     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
14     dispatch_sync(queue,^{
15         NSLog("下载图片1----%@",[NSThread currentThread]);
16     })
17     dispatch_sync(queue,^{
18         NSLog("下载图片2----%@",[NSThread currentThread]);
19     })
20     dispatch_sync(queue,^{
21         NSLog("下载图片3----%@",[NSThread currentThread]);
22     })
23 
24 )
25 
26 //  同步,并发,并发队列失去并发功能,不具备开启新线程的能力,只有主线程

 

4. 用同步函数向串行队列添加任务

 1 // ViewController.m
 2 
 3 #import <ViewController.h>
 4 
 5 @interface ViewController()
 6 
 7 @end
 8 
 9 @implementation ViewController
10 -(void)viewDidLoad{
11     [super viewDidLoad];
12     NSLog(@"主线程----%@",[NSThread mainThread]);
13     dispatch_queue_t queue = dispatch_queue_create("blahblahblah",NULL);
14     dispatch_sync(queue,^{
15         NSLog(@"下载图片1----%@",[NSThrea currentThread]);
16     })
17     dispatch_sync(queue,^{
18         NSLog(@"下载图片2----%@",[NSThrea currentThread]);
19     })
20     dispatch_sync(queue,^{
21         NSLog(@"下载图片3----%@",[NSThrea currentThread]);
22     })
23 
24 )
25 @end
26 
27 // 同步,串行,没有开启新线程的能力,只有主线程

 

总结:

同步函数

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

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

异步函数

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

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

 

多线程-GCD学习笔记

标签:

原文地址:http://www.cnblogs.com/rootandshaw/p/5096593.html

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