Mac OS@H_502_10@线程开发包介绍@H_502_10@ @H_502_10@
Mac OS X提供了到几套API用于创建程序级别的线程。从行为上来看,这些API创建的线程的本质是一样的。
你可以根据你的程序(Carbon,Cocoa,Darwin)选择一套API函数, 同时也要考虑它的性能和复杂度。
举个例子,Cocoa线程使用比较简单,但是它比POSIX线程少了一些弹性和性能。
在接下来的文章我将给你介绍这些不同的线程API,比较每种实现的优点和缺点。所有的线程(除了注明)都是根据当前运行的状态和优先级抢先式运行。
注意:在下面的文章中,线程的介绍从实现的级别由低到高的方式介绍,展示了每层上线程的实现是如何建立在上一层的技术之上。这个顺序并不能作为你应用程序使用的建议指导。你选择必须是根据当前的具体功能和性能要求作出分析。
Mach Threads
POSIX Threads
Cocoa Threads
Carbon Multiprocessing Services
Carbon Thread Manager
Mach threads (有时候指内核线程)提供了系统级别的线程的实现方法。所有其它的线程函数都是建立在Mach线程之上。应用程序开发者很少需要直接使用Mach线程。Mach线程一般用于内核级别程序的开发,像内核的扩展程序。应用程序如果需要调用的线程的话,应该是使用POSIX或其它更高层次的API。
注意@H_502_10@:@H_502_10@ 虽然I/O Kit运行在内核级别,但是它们没有直接使用Mach线程,相反,I/O Kit 定义自己的类和函数来实现线程。如想了解更多的信息,请参照Device Drivers (Kernel/IOKit) Reference.
一个POSIX 线程(通常指一个“pthread”)是一个基于Mach线程封装的较量级的API,它提供了用户级别的处理。POSIX线程是所有应用程序级别线程的基础,包括Cocoa线程,Carbon线程,POSIX线程是基于C语言的API函数,提供了全面的创建控制和信息读取的功能。全面也意味着你的程序必须比其它线程API需要更多的设置和管理。(举个例子,不像其它的线程包,一个POSIX线程是不会自动同程序的主线程发生联系。) 因为程序对于线程的行为需要更多的控制,可是,POSIX 线程比其它API提供了更高的性能。
另一个好处就是POSIX 线程API已经在多个平台上实现,因此,你用POSIX 线程实现的代码能够运行在大多数的Unix和Windows操作系统。
如想了解更多的信息,请参照pthread主页。
Cocoa threads (用NSThread类实现)提供了一个创建和管理线程的高级类。NSThread内部是采用POSIX线程来实现,但是NSThread也提供了更多自动管理POSIX线程的数据和行为的能力。它同时也会派发Cocoa通知消息给应用程序,通知应用程序当前的线程状态。
这个NSThread类应该在Cocoa应用程序或其它使用Foundation framework的程序优先使用。NSThread对象的性能非常好,虽然一些额外的开销使得它比POSIX线程慢。但在大部分的情况下,这些开销是可以忽略不计的。
更多关于创建Cocoa线程和使用NSThread类,请参照“Creating Threads in Cocoa”。
在Carbon 应用程序中,Carbon Multiprocessing Services 是作为抢先式线程的管理API。这个模型是建立在Mac OS 9的MP Task API之上,创建MP Task API只是 Carbon线程管理的折中模型。使用Multiprocessing Services API,一个应用程序可以在多处理机器上运行抢先式的线程,同时具有并行运行能力。
对于Carbon应用程序,Multiprocessing Services是创建线程的首选。这些API创建抢先式线程与POSIX线程和NSThread类是差不多的。而且,这个API也提供了一些更强的功能,如线程的同步,通知,定时,远程调用,异常处理,semaphores和临界标记。
更多关于使用Multiprocessing Services API信息,请参照Multiprocessing Services Programming Guide. 和 Multiprocessing Services Reference。
Carbon Thread Manager是一个历史遗留的API,主要作用是为了Carbon应用程序管理一系列辅助线程。不像抢先式线程,这里的每个线程的运行依赖与其它线程,指定的时间内只有一个应用程序的辅助线程可以在运行。线程由一个叫round-robin manner选择,当它们收到内核的通知运行的时候,你可以把这些辅助线程看成是一个组。收到内核通知的时候这个组中只能有一个被激活的线程可以运行,其它线程进入休眠状态一直要等到运行线程进入到休眠。
注意@H_502_10@:@H_502_10@ 我们不建议现在还用Carbon线程管理来进行线程开发。这些API只要为了那些把他们的应用程序转到Mac OS X,同时那些代码还需要辅助线程。假如你现在正在写一个新的Carbon应用程序,必须要用POSIX线程或Multiprocessing Services API来替换。