多线程编程摘录(二): 线程管理(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
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 |
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- C#实现多线程的同步方法实例分析
- C#线程间不能调用剪切板的解决方法
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- 简单对比C#程序中的单线程与多线程设计
- C#停止线程的方法
- 解析C#多线程编程中异步多线程的实现及线程池的使用
- C#子线程更新UI控件的方法实例总结
- C#多线程学习之(六)互斥对象用法实例
- C#线程队列用法实例分析
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- 分享我在工作中遇到的多线程下导致RCW无法释放的问题