开发者文档之多线程编程指南学习笔记
2015-11-18 00:17
330 查看
线程是单个应用中可以并发执行多个代码路径的多种技术之一。
多核让计算机有了同时执行多个任务的能力。
多现程的优势:
1.多个线程可以提高应用程序的感知响应。
2.多个线程可以提高应用车公孽杀在多核系统上的实时性能。
线程的状态:运行、就绪、阻塞。
run loop为线程检测一个或多个事件源。
Run Loops 可以让你使用最小的资源来创建长时间运行的线程。
线程编程的危害之一就是多个线程之间的资源争夺。常用锁、条件、原子操作和其他技术来同步资源的访问。
锁提供了只有一个线程可以执行代码的有效保护形式。
创建一个线程:
1.使用NSThread
使用detachNewThreadSelector:toTarget:withObject:l类方法来生成一个新线程。
2.创建一个新的NSThread对象,并调用它的start方法。
这两种方式创建的线程,在线程退出时,线程的资源由系统自动回收。
如果拥有一个NSThread对象,它的线程当前正在运行,可以给该线程发送消息的唯一方法是在你的应用程序的任何对象使用:
performSelector:onThread:withObject:waitUntilDone:方法。但是不能周期的循环的使用该方法来实现线程间的通信。
使用POSIX的多线程
POSIX可移植性操作系统接口
脱离线程(Datached thread):比较受欢迎,因为他们允许系统在线程完成的时候立即释放它的数据结构。
线程的中断,一般建议,让线程正常退出。不鼓励强制杀死一个线程,强制杀死一个线程,会阻止线程本身的清理工作。线程分配的内存可能造成泄漏,并且其他线程当前使用的资源可能没有被正确清理干净,之后造成潜在的问题。
第三章 Run Loops
Run Loops 是线程相关的基础框架的一部分。
一个run loop
就是一个时间处理的循环,用来不停地调度工作以及处理输入事件。
run loop 是让你的线程在有工作的时候工作,无工作的时候处于休眠。
run loop接收输入事件有两种不同的来源:输入源(input source)和定时源(timer source)。
输入源传递异步事件,通常消息来自于其他线程或程序。
定时源则传递同步时间,发生在特定时间或者重复的时间间隔。
第四章 线程同步
同步工具:
原子操作
内存屏障和Volatile(易挥发的,变化无常的)
锁:(锁类型:Mutex互斥锁、Recursive lock递归锁、Read-write lock读写锁、Distributed
lock分布锁、Spin lock自旋锁、Double-checked lock双重检查锁)
大部分锁类型都合并了内存屏障来确保在进入临界区之前它前面的加载和存储指令都已经完成。
条件:条件是信号量的另外一种形式,它允许在条件为真的时候线程间互相发送信号。
条件和互斥锁的区别在于多个线程被允许同时访问一个条件。条件更多是允许不同线程根据一些指定的标准通过的守门人。
执行Selector例程
同步的成本和性能:
同步能保证代码正确执行,但有时候会牺牲部分性能。如发生锁的争夺,则会使线程进入阻塞。
死锁:任何时候线程视图同时获得多于一个锁,都有可能引发潜在的死锁。当两个不同的线程分别保持一个锁(而该锁是另外一个线程需要的)又视图获得另外线程的锁时就会发生死锁。结果是每个线程都会进入持久性阻塞状态,因为它永远不可能获得另外那个锁。
活锁:当两个线程竞争同一个资源的时候就可能发生活锁。
在发生活锁的情况里,一个线程放弃他的第一个锁并试图获得第二个锁,一旦它获得第二个锁,他返回并试图再次获得一个锁。线程就会被锁起来,因为它花费所有的额时间来释放一个锁,并试图获取其他锁,而不做实际的工作。
避免死锁和活锁的最好方法是同一个时间只拥有一个锁。如果你必须在同一时间获取多于一个锁,你应该确保其他线程没有做类似的事情。
线程安全总结:
不可变的对象一般是线程安全的。可变对象通常不是线程安全的。为了在多线程应用使用可变对象,应用必须适当的同步。
多核让计算机有了同时执行多个任务的能力。
多现程的优势:
1.多个线程可以提高应用程序的感知响应。
2.多个线程可以提高应用车公孽杀在多核系统上的实时性能。
线程的状态:运行、就绪、阻塞。
run loop为线程检测一个或多个事件源。
Run Loops 可以让你使用最小的资源来创建长时间运行的线程。
线程编程的危害之一就是多个线程之间的资源争夺。常用锁、条件、原子操作和其他技术来同步资源的访问。
锁提供了只有一个线程可以执行代码的有效保护形式。
创建一个线程:
1.使用NSThread
使用detachNewThreadSelector:toTarget:withObject:l类方法来生成一个新线程。
2.创建一个新的NSThread对象,并调用它的start方法。
这两种方式创建的线程,在线程退出时,线程的资源由系统自动回收。
如果拥有一个NSThread对象,它的线程当前正在运行,可以给该线程发送消息的唯一方法是在你的应用程序的任何对象使用:
performSelector:onThread:withObject:waitUntilDone:方法。但是不能周期的循环的使用该方法来实现线程间的通信。
使用POSIX的多线程
POSIX可移植性操作系统接口
脱离线程(Datached thread):比较受欢迎,因为他们允许系统在线程完成的时候立即释放它的数据结构。
线程的中断,一般建议,让线程正常退出。不鼓励强制杀死一个线程,强制杀死一个线程,会阻止线程本身的清理工作。线程分配的内存可能造成泄漏,并且其他线程当前使用的资源可能没有被正确清理干净,之后造成潜在的问题。
第三章 Run Loops
Run Loops 是线程相关的基础框架的一部分。
一个run loop
就是一个时间处理的循环,用来不停地调度工作以及处理输入事件。
run loop 是让你的线程在有工作的时候工作,无工作的时候处于休眠。
run loop接收输入事件有两种不同的来源:输入源(input source)和定时源(timer source)。
输入源传递异步事件,通常消息来自于其他线程或程序。
定时源则传递同步时间,发生在特定时间或者重复的时间间隔。
第四章 线程同步
同步工具:
原子操作
内存屏障和Volatile(易挥发的,变化无常的)
锁:(锁类型:Mutex互斥锁、Recursive lock递归锁、Read-write lock读写锁、Distributed
lock分布锁、Spin lock自旋锁、Double-checked lock双重检查锁)
大部分锁类型都合并了内存屏障来确保在进入临界区之前它前面的加载和存储指令都已经完成。
条件:条件是信号量的另外一种形式,它允许在条件为真的时候线程间互相发送信号。
条件和互斥锁的区别在于多个线程被允许同时访问一个条件。条件更多是允许不同线程根据一些指定的标准通过的守门人。
执行Selector例程
同步的成本和性能:
同步能保证代码正确执行,但有时候会牺牲部分性能。如发生锁的争夺,则会使线程进入阻塞。
死锁:任何时候线程视图同时获得多于一个锁,都有可能引发潜在的死锁。当两个不同的线程分别保持一个锁(而该锁是另外一个线程需要的)又视图获得另外线程的锁时就会发生死锁。结果是每个线程都会进入持久性阻塞状态,因为它永远不可能获得另外那个锁。
活锁:当两个线程竞争同一个资源的时候就可能发生活锁。
在发生活锁的情况里,一个线程放弃他的第一个锁并试图获得第二个锁,一旦它获得第二个锁,他返回并试图再次获得一个锁。线程就会被锁起来,因为它花费所有的额时间来释放一个锁,并试图获取其他锁,而不做实际的工作。
避免死锁和活锁的最好方法是同一个时间只拥有一个锁。如果你必须在同一时间获取多于一个锁,你应该确保其他线程没有做类似的事情。
线程安全总结:
不可变的对象一般是线程安全的。可变对象通常不是线程安全的。为了在多线程应用使用可变对象,应用必须适当的同步。
相关文章推荐
- c++ 默认构造函数,构造函数,复制构造函数,赋值操作符,析构函数调用示例
- Polygon Table - Google Chrome
- 浅浅谈Java反射机制( JAVA Reflection)
- C++map遍历删除数据(删除被2整除的键值对)
- 框架代码的打磨之路
- 回车与换行的区别
- ASP.NET实现根据URL生成网页缩略图的方法
- asp.net微信开发(已关注用户管理)
- asp.net微信开发(用户分组管理)
- 使用PHP实现生成HTML静态页面
- 使用PHP uniqid函数生成唯一ID
- 基于PHP给大家讲解防刷票的一些技巧
- php生成唯一数字id的方法汇总
- php+ajax实现无刷新分页
- 标准版Eclipse搭建PHP环境的详细步骤
- 为什么Laravel会成为最成功的PHP框架?
- PHP编程中的锁
- 对SpringAop的思考之静态代理
- SpringMVC+ajaxFileUpload上传图片 IE浏览器弹下载框问题解决方案
- ActiveMQ 集成到项目中activemq-all jar包引起的依赖问题