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

多线程编程摘录(二): 线程管理(1)

2016-07-21 22:17 267 查看
Mac OS X 和
iOS 里面的每个进程都是有一个或多个线程构成,每个线程都代表一个代码的执行路径。每个应用程序启动时候都是一个线程,它执行程序的
main 函数。应用程序可以生成额外的线程,其中每个线程执行一个特定功能的代码 

当应用程序生成一个新的线程的时候,该线程变成应用程序进程空间内的一个实体。每个线程都拥有它自己的执行堆栈,由内核调度独立的运行时间片 

一个线程可以和其他线程或其他进程通信,执行
I/O 操作,甚至执行任何你想要它完成的任务。因为它们处于相同的进程空间,所以一个独立应用程序里面的所有线程共享相同的虚拟内存空间,并且具有和进程相同的访问权限。 

多线程会占用你应用程序(和系统的)的内存使用和性能方面的资源。每个线程都需要分配一定的内核内存和应用程序内存空间的内存。管理你的线程和协调其调度所需的核心数据结构存储在使用
Wired Memory
的内核里面。你线程的堆栈空间和每个线程的数据都被存储在你应用程序的内存空间里面。这些数据结构里面的大部分都是当你首次创建线程或者进程的时候被创建和初始化的,它们所需的代价成本很高,因为需要和内核交互。 

因为底层内核的支持,操作对象(Operation objectis)可能创建线程更快。它们使用内核里面常驻线程池里面的线程来节省创建的时间,而不是每次都创建新的线程。 

使用 initWithTarget:selector:object:方法的替代办法是子类化
NSThread,并重写它的
main 方法。你可以使用你重写的该方法的版本来实现你线程的主体入口。 

如果你拥有一个 NSThread
对象,它的线程当前真正运行,你可以给该线程发送消息的唯一方法是在你应用程序里面的任何对象使用

performSelector:onThread:withObject:waitUntilDone:方法。在
Mac OS X v10.5支持在多线程上面执行
selectors(而不是在主线程里面),并且它是实现线程间通信的便捷方法 

尽管 POSIX
例程和 NSThread
类被推荐使用来创建低级线程,但是其他基于
C 语言的技术在
Mac OS X
上面同样可用。在这其中,唯一一个可以考虑使用的是多处理服务(Multiprocessing Services),它本身就是在
POSIX 线程上执行。多处理服务是专门为早期的
Mac OS 版本开发的,后来在
Mac OS X
里面的 Carbon
应用程序上面同样适用。如果你有代码真是有该技术,你可以继续使用它,尽管你应该把这些代码转化为
POSIX。该技术在
iOS 上面不可用。 

为了让 Cocoa
知道你正打算使用多线程,你所需要做的是使用
NSThread
类生成一个线程,并让它立即退出。你线程的主体入口点不需要做任何事情。只需要使用NSThread
来生成一个线程就足够保证
Cocoa 框架所需的锁到位。

如果你不确定 Cocoa
是否已经知道你的程序是多线程的,你可以使用
NSThread的
isMultiThreaded
方法来检验一下。

混合
POSIX 和
Cocoa 的锁

在同一个应用程序里面混合使用
POSIX 和
Cocoa 的锁很安全。Cocoa
锁和条件对象基本上只是封装了
POSIX 的互斥体和条件。然而给定一个锁,你必须总是使用同样的接口来创建和操纵该锁。换言之,你不能使用
Cocoa 的
NSLock 对象来操纵一个你使用
pthread_mutex_init
函数生成的互斥体,反之亦然。 

 

配置线程的堆栈大小: 

                                                      Setting the stack size of a thread 

 Technology

  Option

 
Cocoa

In iOS and Mac OS X v10.5 and later, allocate and initialize an
NSThread
object (do notuse thedetachNewThreadSelector:toTarget:withObject:
method). Before calling the

start
method of the thread object, use thesetStackSize:
method to specify the new

stack size.

POSIX

Create a new
pthread_attr_t
structure and use the
pthread_attr_setstacksize

function to change the default stack size. Pass the attributes to the
pthread_create

function when creating your thread.

Multiprocessing

Services

Pass the appropriate stack size value to the
MPCreateTask
function when you create your

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程 线程