经过合理建立任务(或线程)的方式,能够有效地提升软件设计的模块性。经过让一个任务关注于某一类事务,有助于简化任务体函数的实现,以及提升程序的可维护性。另外,多任务在很多情形下,将提升系统的运行效率,由于一个任务在等待所需资源时,另外一个任务能够利用处理器作更多的事。尽管多任务有它的好处,但使用多任务的“度”很重要。就做者的观察,多任务设计方法大有被滥用之势,乃至有的工程师习惯于一作设计就想到运用多任务。出现这种情况的缘由,是由于没有意识到多任务设计所带来的问题。编程
运用多任务的设计方法,每每须要使用到任务同步的方法(互斥锁、信号量、事件和消息队列等),以保证多个任务有序地协同工做,以便避免出现竞争问题。可是,使用任务同步的方法并非每一个人都很擅长,乃至即便以为本身很擅长,也很容易一糊涂就设计出存在竞争问题的代码。再则,对于大型项目,因为代码量的急剧增加,多任务所带来的竞争问题更加不容易被发现,一旦发生问题就相对严重,并且不容易查错。网络
任务数量使用得过多,所带来的另外一个问题是,由于多个任务的存在,将带来更多的任务切换。也由于任务过多,而使得任务之间的通信开销更大。总的来讲是,有可能形成系统性能问题。多线程
做者也经历了从大量使用多任务设计到回归避免使用多任务的成长历程,也明白在不少情形下,采用多任务设计的冲动源于卖弄本身具有多任务的编程能力,以及愧疚于不采用多任务会形成系统性能问题。其实,一旦咱们冷静下来思考多任务设计时会发现,自认为多任务所带来的好处,在系统中极可能并非关键。另外,咱们也颇有可能没有考虑采用多任务设计所带来的不良反作用。框架
从用户的体验来看,一个软件产品最终必须具有良好的鲁棒性,即稳定。不然,不管多么好的功能特性,产品最终都将被用户给抛弃。所以,软件在开发活动中的主旨之一,应是采用容易得到高质量的方法,而不是运用更多的“高科技”。这种策略,容许适当地下降对团队能力的要求,毕竟,要得到一个能力都很是强的团队不是一件易事。ide
做者曾在一个项目中,开发出了一个运行于Linux操做系统之上的、基于TCP套节字的网络通信框架,采用的是单线程的设计思想。这个框架经过采用select()函数,能够处理多个套接字的建链和通信。在设计的过程当中,由衷地感叹采用单线程的方式大大地简化了设计和调试工做。看成者将这一设计思路与一些同事交流时,他们所表现出来的不理解却截然不同。由于在他们看来,套接字通信不管如何也得考虑用多线程的设计方法。有一点须要交代一下,做者采用单线程的设计方法,也是基于应用场景并不存在大负荷的通信数据。模块化
不管如何,当咱们考虑运用多任务设计时,静下心来思考一下它所带来的利与弊,有助于咱们克服魔鬼般的冲动。一旦考虑清楚了应当采用多任务设计,那仍是应当一往无前。函数
最后,即便是使用更少的任务,也并不妨碍软件的模块化设计。由于经过设计,彻底能够实现模块与任务相分离,也就是即便不采用多任务,一样能够得到良好的软件模块化。性能