IOS多线程.ppt
文本预览下载声明
IOS多线程分析 柳行刚 IOS支持的三种线程范式 1, Thread; 2, Cocoa operations; 3, Grand Central Dispatch (GCD) (iOS4 才开始支持) Thread Thread 是这三种范式里面相对轻量级的,但也是使用起来最负责的,你需要自己管理thread的生命周期,线程之间的同步。线程共享同一应用程序的部分内存空间, 它们拥有对数据相同的访问权限。你得协调多个线程对同一数据的访问,一般做法是在访问之前加锁,这会导致一定的性能开销。 三种形式的IOS 1、Cocoa threads: 使用NSThread 或直接从 NSObject 的类方 2、performSelectorInBackground:withObject: 来创建一个线程。 3、POSIX threads: 基于 C 语言的一个多线程库 如果你选择thread来实现多线程,那么 NSThread 就是官方推荐优先选用的方式。 Cocoa operations Cocoa operations是基于 Obective-C实现的,类 NSOperation 以面向对象的方式封装了用户需要执行的操作,我们只要聚焦于我们需要做的事情,而不必太操心线程的管理,同步等事情,因为NSOperation已经为我 们封装了这些事情。 NSOperation 是一个抽象基类,我们必须使用它的子类。iOS 提供了两种默认实现:NSInvocationOperation 和 NSBlockOperation。 Grand Central Dispatch (GCD): Grand Central Dispatch (GCD): iOS4 才开始支持,它提供了一些新的特性,以及运行库来支持多核并行编程,它的关注点更高:如何在多个 cpu 上提升效率。 NSThread线程创建 NSThread的创建主要有两种直接方式: [NSTredad etachNewThreadSelector:@selector(myThreadMainMethod :)toTarget:self withObject:nil]; 和 NSThread*my Thread=[[NS Thread alloc] initWith Targets elf selector:@selector(myThreadMainMethod object:nil]; [my Thread start]; NSThread线程创建两种方式的区别 这两种方式的区别是:前一种一调用就会立即创建一个线程来做事情;而后一种虽然你 alloc 了也 init了,但是要直到我们手动调用 start 启动线程时才会真正去创建线程。这种延迟实现思想在很多跟资源相关的地方都有用到。后一种方式我们还可以在启动线程之前,对线程进行配置,比如设置 stack 大小,线程优先级。 NSThread线程创建的一种间接方式 还有一种间接的方式,更加方便,我们甚至不需要显式 编写NSThread相关代码。那就是利用NSObject的类方法 performSelectorInBackground:with Object:来创建一个线程 [myObj performSelectorInBackground:@selector(my ThreadMainMethod)withObject:nil]; 其效果与 NSThread的detachNewThreadSelector:toTarget withObject:是一样的。 线程同步 线程的同步方法跟其他系统下类似,我们可以用原子操作 ,可以用mutex,lock等。iOS的原子操作函数是以OSAtomic 开头的,比如:OSAtomicAdd32, OSAtomicOr32等等。这 些函数可以直接使用,因为它们是原子操作。iOS中的mutex 对就的是NSLock,它遵循NSLooking协议,我们可以使用lo ck,tryLock,lockBeforeData:来加锁,用unLock来解锁。 线程同步示例 BOOL moreToDo = YES; NSLock *theLock = [[NSLock alloc] init]; ... while (moreToDo) { /* Do another increment of calculation */ /* until there’s no more to do. */ if ([theLock tryLock]) {
显示全部