关于多线程的思考
2015-04-05 07:01
183 查看
当准备编制程序完成某项较为复杂的事情时,一般面临这样几种情况。
一是在单进程单线程的情况下设计程序,这个程序可能不得不在在单个执行流中处理如用户交互,数据计算,外设访问等不同类型的任务,使得各种任务的处理互相牵制,导致程序设计复杂且运行效率较低。这种情况在早期的os只支持单进程单线程时必须面对。
二是在多进程单线程的情况,此时可以将不同类型的任务分配到多个进程,简化程序设计,提高运行效率。不过由于多进程之间共享信息和相互通信的低效率,会降低程序运行的效率。不过,多进程具有故障隔离,多个任务之间不互相影响的好处。
三是采用单进程多线程的设计,此时可以把不同类型的任务分配到多个线程,由于多个线程可以共享进程资源,效率较之多进程要高,但是多线程访问共享资源需要注意一致性问题,且线程之间会互相影响,如踩踏对方的内存,造成问题定位的困难。
后两种方式在多cpu环境,会提高程序运行的效率。即使在单cpu环境下,后两种的效率也会高于第一种。
这几种方式各有利弊,对于简单的事情,可以采用单进程单线程的方式做,如一些单片机小程序,此时也需要具备面对此种情况的设计能力。而对于复杂的事情,可以根据程序的运行环境,对可靠性/性能等不同质量属性的设计考虑权重,来确定采用上面的那种设计方式。应该说,多种方式可供选择,增加了程序设计的灵活性,是我们软件人员的好事情。
在unix高级编程11.16图中的程序,利用barrier,建立8个线程来分解处理一个大量数据的排序,在多cpu的硬件环境中,可以大幅提高计算效率。这种情况就充分利用了多线程可以共享存储的特点。如果是用多进程来做这件事,可能就无法达成这样的效果。因此,多线程这种编程模型,必然尤其特别适合的应用场合,大体就是,各个任务相对独立,但有较大的资源共享要求,此时多线程模型就比较合适。
一是在单进程单线程的情况下设计程序,这个程序可能不得不在在单个执行流中处理如用户交互,数据计算,外设访问等不同类型的任务,使得各种任务的处理互相牵制,导致程序设计复杂且运行效率较低。这种情况在早期的os只支持单进程单线程时必须面对。
二是在多进程单线程的情况,此时可以将不同类型的任务分配到多个进程,简化程序设计,提高运行效率。不过由于多进程之间共享信息和相互通信的低效率,会降低程序运行的效率。不过,多进程具有故障隔离,多个任务之间不互相影响的好处。
三是采用单进程多线程的设计,此时可以把不同类型的任务分配到多个线程,由于多个线程可以共享进程资源,效率较之多进程要高,但是多线程访问共享资源需要注意一致性问题,且线程之间会互相影响,如踩踏对方的内存,造成问题定位的困难。
后两种方式在多cpu环境,会提高程序运行的效率。即使在单cpu环境下,后两种的效率也会高于第一种。
这几种方式各有利弊,对于简单的事情,可以采用单进程单线程的方式做,如一些单片机小程序,此时也需要具备面对此种情况的设计能力。而对于复杂的事情,可以根据程序的运行环境,对可靠性/性能等不同质量属性的设计考虑权重,来确定采用上面的那种设计方式。应该说,多种方式可供选择,增加了程序设计的灵活性,是我们软件人员的好事情。
在unix高级编程11.16图中的程序,利用barrier,建立8个线程来分解处理一个大量数据的排序,在多cpu的硬件环境中,可以大幅提高计算效率。这种情况就充分利用了多线程可以共享存储的特点。如果是用多进程来做这件事,可能就无法达成这样的效果。因此,多线程这种编程模型,必然尤其特别适合的应用场合,大体就是,各个任务相对独立,但有较大的资源共享要求,此时多线程模型就比较合适。
相关文章推荐
- 关于多线程的思考
- 关于多线程的思考
- 关于多线程的一点思考
- 关于多线程中如何实现生产者消费者和谐统一的思考
- 关于多线程编程的一点思考
- 关于java中多线程的问题的一点思考(什么情况下需要考虑到线程,以及线程安全的问题?)
- 关于多线程/多进程的一些思考
- 关于多线程之GCD的两点问题思考
- tensorflow 多线程操作文件中关于文件名命名的思考
- J2ME学习笔记--关于多线程,集合,lang,util的思考
- 关于多线程访问sqlite 数据库的思考
- 关于多线程效率的思考
- 关于多线程导致数据不一致的情况的思考
- 关于Windows下ShellCode编写的一点思考
- 关于软件注册的一点思考
- 关于.Text如何过滤恶意脚本的思考
- 关于中国软件业国际化的思考
- 关于多线程多任务的请教!
- 关于人生哲理——思考
- 关于C#多线程的WaitHandle