您的位置:首页 > 编程语言 > C语言/C++

多线程学习笔记

2016-02-14 22:46 453 查看

GCD

Gcd 是基于C语言的,特点就是函数名称比较长,但非常强大,充分利用了多核硬件。

有两个概念

1.同步函数/异步函数

2.串行队列/并发队列

两个概念的理解

同步函数只在当前线程进行队列中的任务,不会再多开线程。异步是会多开线程来完成队列里面的任务。

将任务放到串行队列中是按FIFO原则按顺序一个个执行的,而并发队列是尽可能的占用所有现开的线程去执行队列里面的任务,但还是遵循FIFO的原则。

函数的基本使用示例

创建队列

//创建队列
//创建串行队列
dispatch_queue_t queue1 = dispatch_queue_create(<#队列名#>, DISPATCH_QUEUE_SERIAL);

//创建并发队列。
dispatch_queue_t queue2 = dispatch_queue_create(<#队列名称#>, DISPATCH_QUEUE_CONCURRENT);

//获得主队列,特点是该队列里面的任务只能在主线程里面执行,相当于淡化了同步函数或异步函数的作用。
dispatch_queue_t queue3 = dispatch_get_main_queue();

//获得全局队列,全局队列是并发队列。
dispatch_queue_t queue4 = dispatch_get_global_queue(<#优先级#>, <#默认为0#>);

//创建队列组,可以将队列添加到队列组中在配合通知函数可以起到在队列组任务执行完后再执行通知队列的效果,详见下面。
dispatch_queue_t queue5 = dispatch_group_create();
// 创建一个队列组
dispatch_group_t group = dispatch_group_create();


2.创建任务

//创建函数
//同步函数
dispatch_sync(<#队列名称#>, ^{
//添加要执行的任务到此处。
})

//异步函数
dispatch_async(<#队列名称#>, ^{
//添加要执行的任务到此处。
})


其他函数补充

1.队列组

//创建队列函数
dispatch_group_async(<#组队列#>, <#要添加到队列组的队列#>, <#^(void)block#>);//block放要往队列添加的任务

//在队列组执行完后执行
dispatch_group_notify(<#等待执行的组队列#>, <#dispatch_queue_t queue#>, <#^(void)block#>);//与上面的函数配合起到的作用相当于NSOperation的依赖关系。


2.线程之间通信

dispatch_group_notify(group, queue, ^{  //这块不一定是这个函数,随便举个例子。
//在副线程做的任务

// 回到主线程做事
dispatch_async(dispatch_get_main_queue(), ^{
// 任务,这块可以利用上面福线程的一些信息到主线程来使用。
});
});


NSOperation

NSOperation是基于GCD的,更加面向对象。

NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类,子类的方式有3种

NSInvocationOperation

NSBlockOperation

自定义子类继承NSOperation,实现内部相应的方法

配合NSOperationQueue可以实现多线程编程。

具体实现

将任务封装到一个NSOperation对象中。

将对象添加到NSOperationQueue中,这样系统就会自动开一条线程来执行对象里面封装的任务。

自定义子类继承NSOperation

1.创建对象封装任务

//  XMGOperation.h 自定义的一个子类,继承NSOperation
#import <Foundation/Foundation.h>
@interface XMGOperation : NSOperation
@end
----------------------------------------

#import "XMGOperation.h"
@implementation XMGOperation

/**
* 需要执行的任务
*/
- (void)main
{
for (NSInteger i = 0; i<1000; i++) {
//任务
}
if (self.isCancelled) return; //执行耗时任务时要不断手动询问是否取消任务。

for (NSInteger i = 0; i<1000; i++) {
//任务
}
if (self.isCancelled) return;
}
@end
4000


2.将对象添加到NSOperationQueue中

//创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 创建XMGOperation
XMGOperation *op = [[XMGOperation alloc] init];

// 添加任务到队列中
[queue addOperation:op]; // [op1 start]


NSBlockOperation 的使用演示

// 创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 设置最大并发操作数
//    queue.maxConcurrentOperationCount = 2;
queue.maxConcurrentOperationCount = 1; // 就变成了串行队列

// 创建操作**被屏蔽的是比较原始的步骤,下面的更加简洁快速。
// NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
// 任务
// }];
//[op1 addExecutionBlock:^{//任务}];//给对象添加任务。

// 添加操作到队列中
//    [queue addOperation:op1];
-----------------------------------------
[queue addOperationWithBlock:^{
//任务
}];
[queue addOperationWithBlock:^{
//任务
}];


NSInvocationOperation

// 创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 创建NSInvocationOperation
NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(<#此处写函数名,函数内为任务#>) object:nil];
NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(<#同上#>) object:nil];

// 添加任务到队列中
[queue addOperation:op1]; //自动执行
[queue addOperation:op2]; //自动执行


队列的取消与暂停

取消队列的所有操作

-(void)cancelAllOperations;

提示:也可以调用NSOperation的- (void)cancel方法取消单个操作

暂停和恢复队列

(void)setSuspended:(BOOL)b; // YES代表暂停队列,NO代表恢复队列

(BOOL)isSuspended;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息