concurrencyProgrammingGuide 1

thread用来表述执行代码的独立path。os x的线程执行基于POSIX 线程API.

process用来表述一个运行操作,可以包含多个线程。

task用来描述工作的抽象概念。

Concurrency and Application Design 

不是依赖threads,os x和ios使用的是asynchronous design approach来解决并发的问题。异步函数在操作系统中已经使用多年用来初始化可能需要花费大量时间的task,比如从disk读取数据。当被调用的时候,异步函数会在后台执行一些操作然后在task可能完成前返回。首先,这个工作就包含了后台thread,在thread上执行desired task然后给caller发送通知的功能。在之前,如果一个异步函数不存在,你需要写你自己的异步函数并且创建线程。但是现在,os x和ios提供的技术使得你可以执行任何的异步任务而且不用再管理线程。

其中的一个异步任务技术就是Grand Central Dispatch (GCD)。这个技术负责线程管理code并且把他设置为sysytem level。你只需要定义想执行的task并且把它们添加到一个合适的dispathch queue中就可以了。gcd负责创建需要的线程并且将你的tasks分配在这些线程中运行。因为线程管理不是系统部分,gcd比传统线程提供一个整体的途径来管理和执行提供更好更有效的操作。

Operation queues 是objective c对象集合非常像dispathch queues。你定义想要执行的tasks并且添加到operation queue中,它负责安排和执行这些tasks。像gcd,operation queue为你处理所有的线程管理,确保tasks执行得又快又好。

Dispatch Queues 

是基于c的执行自定义tasks的机制。一个dispatch queue总是以串行或者并发的方式执行任务。先进先出的原则。串行dispatch queue每次只执行一个task。要等待当前的task完成后才执行新的task。相反的,并发的dispatch queue会同时启动多个tasks而不需要等待其他的task完成。

dispatch queues还有其他的优点:

它们提供一个直接的并且简单的编程接口

它们提供自动的和整体的线程池管理

它们提供协调好的集合加速

它们有更多的内存空间。

Serial dispatch queues offer a more efficient alternative to locks and other synchronization primitives.

你提交给dispatch queue的tasks必须封装在函数或者block对象中。

Dispatch Sources 

异步处理特定类型系统事件的基于c的机制。dispatch source疯长一个特定类型的系统事件并且当有事件发生时提交一个特定的block对象或者函数到dispatch queue中。你可以使用dispatch sources来映射以下类型的系统事件:

  • Timers
  • Signal handlers Descriptor-related events Process-related events
  • Mach port events
  • Custom events that you trigger

Asynchronous Design Techniques 

你采用并发前应当考虑是否有这个必要首先。如果使用不当不会使得你的程序运行流畅反而会更慢甚至影响用户操作。

Define Your Application’s Expected Behavior 

  • 首先你需要估计出你的应用程序使用的tasks和每个task相关联的对象或者data structures。首先,你可能想在用户选择一个menu item或者点击一个button的时候开始执行一个task。就是要首先列出high-level tasks。
  • 然后把每个task细分成一系列的步骤来确保task执行成功。这时你需要主要关注有关data structures和objects的一系列修改。并且这些修改将会如何影响你的应用程序。
  • 而且你要关注objects和data structures之间的dependencies。如果修改一处不会影响其他的那么就可以考虑使用并发。

When to Use Threads 

要看情况是否需要创建线程。当implement code必须在real time时运行就可以考虑使用线程。dispatch queues 会尽可能快地运行tasks但是它们不address real time 约束。如果你想在后台执行,线程可能更合适。

Operation Queues 

About Operation Objects 

operation object是一个NSOperation类型的实例。

NSInvocation-Operation : 创建一个operation object

NSBlockOperation: 并发执行一个或者多个block objects

NSOpretion:自定义operaiton object

Creating an NSInvocationOperation Object 

当运行时,调用你指定对象的selector。使用这个类来防止为每一个task定义大量的自定义operation objects。特别是当你正在修改一个现有的程序并且已经有一些objects和methods需要执行tasks的时候。

创建一个invocation 类型实例,传送想要的object和selector。例子如下:

@implementation MyCustomClass
  - (NSOperation*)taskWithData:(id)data {

NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(myTaskMethod:) object:data]; 

 return theOp;
  }
  // This is the method that does the actual work of the task.
  - (void)myTaskMethod:(id)data {
      // Perform the task.
  }@end 

Creating an NSBlockOperation Object 

封装一个或者多个block objects。当你创建一个block operation时,你其实至少添加了一个block在初始化阶段。你也可以添加多个blocks。当执行NSBlockOperation object时,object提交所有的blocks到默认优先级的并发dispatch queue.object会等待所有的blocks执行完成。当最后一个block执行完成后,operation object就会标记自己完成了。以下就是创建了一个NSBlockOperation object. block没有参数并且没有返回显示结果的例子:

NSBlockOperation* theOp = [NSBlockOperation blockOperationWithBlock: ^{
      NSLog(@"Beginning operation.\n");
      // Do some work.}]; 

addExecutionBlock 用来创建更多的blocks。如果你需要blocks串行执行,那么你必须直接把它们提交到想要的dispatch queue中。

Defining a Custom Operation Object

你可以子类化NSOperation并且添加任何你想要的操作。

Performing the Main Task 

每一个operation object应该执行至少两个方法:
  • 一个custom initialization method
  • main

你需要一个自定义的初始化方法来把你的operation object放到一个知道的状态并且还要有一个main方法来执行你的task。你可以执行额外需要的方法如下:

  • Custom methods that you plan to call from the implementation of your main method
  • Accessor methods for setting data values and accessing the results of the operation
  • Methods of the NSCoding protocol to allow you to archive and unarchive the operation object 

例子如下:

@interface MyNonConcurrentOperation : NSOperation
@property id (strong) myData;
-(id)initWithData:(id)data;
@end
@implementation MyNonConcurrentOperation
- (id)initWithData:(id)data {
   if (self = [super init])
      myData = data;
   return self;
}
-(void)main {
   @try {
      // Do some work on myData and report the results.
   }
   @catch(...) {
      // Do not rethrow exceptions.

} }

@end

时间: 2024-10-04 06:59:54

concurrencyProgrammingGuide 1的相关文章

NSOperation的使用细节 [1]

NSOperation 使用起来并没有GCD直观,但它有着非常不错的面向对象接口,还可以取消线程操作,这一点是GCD所没有的,NSOperation本身是抽象类,不能够拿它直接使用. 以下节选自 ConcurrencyProgrammingGuide 其中 NSBlockOperation 与 NSInvocationOperation 是直接继承自 NSOperation 的子类,便于你进行简单的线程操作(为了获取更多的操作条件,我们需要通过继承 NSOperation 来设计更复杂的操作).

iOS开发-多线程NSOperation和NSOperationQueue

上一篇文章稍微提及了一下NSThread的使用,NSThread能直观地控制线程对象,不过需要自己管理线程的生命周期,线程同步,用起来比较繁琐,而且比较容易出错.不过Apple给出了自己的解决方案NSOperation,它本身是抽象基类,因此必须使用它的子类,使用NSOperation子类的方式有NSInvocationOperation和NSBlockOperation两种方式,先补充一下NSThread的用法: NSThread获取当前线程: [NSThread currentThread]

Dispatch Queues调度队列

前言-死锁案例 // 在主线程中执行 dispatch_queue_t queueMain = dispatch_get_main_queue(); dispatch_sync(queueMain, ^{ NSLog(@"+++++++"); }); NSLog(@"hahahaha"); 案例分析:运行结果是程序阻塞在dispatch_sync()处.由于main线程执行到dispatch_sync()处,线程处于等待状态.将block任务块添加到主串行队列最后,

【转载】技术的正宗与野路子

http://kb.cnblogs.com/page/554496/ http://zhangtielei.com/posts/blog-programmer-learn.html 黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. "九阴神抓"本是<九阴真经>中的上乘武功,但当初梅超风夫妇由于拿到的<九阴真经>不完整,学不到里面的内

技术的正宗与野路子

面对一项新技术的时候,我们怎样去学习才能循序渐进,最终理解得深刻? 让我们先把可供自学的资料列出来,分析一下: Tutorial(入门教程).由该项技术的官网提供.通常是英文的.这份资料是给初次接触该项技术的人看的,一般是一步一步地教你完成某些例子.当我们说某项技术对于新手不太友好的时候,一般也是因为这项技术的Tutorial部分做得不够好. Specification,简称Spec.这是集中体现该项技术的设计思想的东西,是高度抽象的描述.这个一般也是一份完备的.系统的描述,包 含该项技术涉及到

巧谈 GCD

转载自:http://www.jianshu.com/p/665261814e24 谈到iOS多线程,一般都会谈到四种方式:pthread.NSThread.GCD和NSOperation.其中,苹果推荐也是我们最经常使用的无疑是GCD.对于身为开发者的我们来说,并发一直都很棘手,如果对GCD的理解不够透彻,那么iOS开发的历程绝对不会顺利.这里,我会从几个角度浅谈我对GCD的理解. 一.多线程背景 Although threads have been around for many years

ios 总结

1 ocoa Touch Layer{ App Extensions https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/index.html Handoff https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/Handoff/HandoffFundamentals

技术的正宗与野路子_转

黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. "九阴神抓"本是<九阴真经>中的上乘武功,但当初梅超风夫妇由于拿到的<九阴真经>不完整,学不到里面的内功心法,硬是把这门上乘武功练到了邪路上,于是就成了"九阴白骨爪".周芷若为求速成,也练就了这门邪功. 但黄衫女子乃出身武林名门(相传是杨过和小龙女的后人),自然修

iphone ios 如何使用gcd,block

iphone ios 如何使用gcd,block 转自:http://blog.sina.com.cn/s/blog_45e2b66c01010dhd.html 1.GCD之dispatch queue http://www.cnblogs.com/scorpiozj/archive/2011/07/25/2116459.html 2.iOS中GCD的魔力 http://blog.csdn.net/favormm/article/details/6453260 3.官方 ,内容真的很多 http