通过合理创建任务(或线程)的方式,可以有效地提高软件设计的模块性。通过让一个任务关注于某一类事务,有助于简化任务体函数的实现,以及提高程序的可维护性。另外,多任务在不少情形下,将提高系统的运行效率,因为一个任务在等待所需资源时,另一个任务可以利用处理器做更多的事。尽管多任务有它的好处,但使用多任务的“度”很重要。就作者的观察,多任务设计方法大有被滥用之势,乃至有的工程师习惯于一做设计就想到运用多任务。出现这种状况的原因,是因为没有意识到多任务设计所带来的问题。

运用多任务的设计方法,往往需要使用到任务同步的方法(互斥锁、信号量、事件和消息队列等),以保证多个任务有序地协同工作,以便避免出现竞争问题。但是,使用任务同步的方法并不是每个人都很擅长,乃至即使觉得自己很擅长,也很容易一糊涂就设计出存在竞争问题的代码。再则,对于大型项目,由于代码量的急剧增长,多任务所带来的竞争问题更加不容易被发现,一旦发生问题就相对严重,而且不容易查错。

任务数量使用得过多,所带来的另一个问题是,因为多个任务的存在,将带来更多的任务切换。也因为任务过多,而使得任务之间的通讯开销更大。总的来说是,有可能造成系统性能问题。

作者也经历了从大量使用多任务设计到回归避免使用多任务的成长历程,也明白在很多情形下,采用多任务设计的冲动源于卖弄自己具备多任务的编程能力,以及愧疚于不采用多任务会造成系统性能问题。其实,一旦我们冷静下来思考多任务设计时会发现,自认为多任务所带来的好处,在系统中很可能并不是关键。另外,我们也很有可能没有考虑采用多任务设计所带来的不良副作用。

从用户的体验来看,一个软件产品最终必须具备良好的鲁棒性,即稳定。否则,无论多么好的功能特性,产品最终都将被用户给抛弃。因此,软件在开发活动中的主旨之一,应是采用容易获得高质量的方法,而不是运用更多的“高科技”。这种策略,允许适当地降低对团队能力的要求,毕竟,要获得一个能力都非常强的团队不是一件易事。

作者曾在一个项目中,开发出了一个运行于Linux操作系统之上的、基于TCP套节字的网络通讯框架,采用的是单线程的设计思想。这个框架通过采用select()函数,可以处理多个套接字的建链和通讯。在设计的过程中,由衷地感叹采用单线程的方式大大地简化了设计和调试工作。当作者将这一设计思路与一些同事交流时,他们所表现出来的不理解却大相径庭。因为在他们看来,套接字通讯无论如何也得考虑用多线程的设计方法。有一点需要交代一下,作者采用单线程的设计方法,也是基于应用场景并不存在大负荷的通讯数据。

无论如何,当我们考虑运用多任务设计时,静下心来思考一下它所带来的利与弊,有助于我们克服魔鬼般的冲动。一旦考虑清楚了应当采用多任务设计,那还是应当勇往直前。

最后,即使是使用更少的任务,也并不妨碍软件的模块化设计。因为通过设计,完全可以实现模块与任务相分离,也就是即使不采用多任务,同样可以获得良好的软件模块化。

小心多任务设计被滥用相关推荐

  1. Windows多线程多任务设计初步zz

    [前言:]当前流行的Windows操作系统,它能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程 ...

  2. uc/OS II——多任务设计

    uc/OS II--多任务设计 (1)设计 开始任务 [1]/声明 开始任务 任务块 static OS_STK App_TaskStartStk[APP_TASK_START_STK_SIZE]; ...

  3. Android应用程序和其设计思想--转载----做记录

    转载一篇Android 的先关文章,无论什么时候看都觉得有收获 文章来源地址 http://www.open-open.com/lib/view/open1466070376316.html 以下是正 ...

  4. 设计支线任务?学习这七个游戏吧(还有些Chris Avellone的忠告)

    原文地址: https://www.gamasutra.com/view/news/314812/Designing_side_quests_Study_these_7_games_and_some_ ...

  5. 最小长度电路板排列问题_射频电路板设计,这篇文章五大总结不可忽视!

    射频电路板设计由于在理论上还有很多不确定性,因此常被形容为一种"黑色艺术",但这个观点只有部分正确,RF电路板设计也有许多可以遵循的准则和不应该被忽视的法则. 不过,在实际设计时, ...

  6. Android的多任务之路

    Android真正独特的地方在于它允许多个任务同时运行.由于开发者们来自不同的平台,对这样的运行机制可能会感到惊讶.深入理解它的行为对你的应用程序设计是很重要的,因为这样可以无缝的(seamlessl ...

  7. [从架构到设计]第一回:设计,应该多一点

    [从架构到设计] 第一回:设计,应该多一点 发布日期:2007.8.15 作者:Anytao ©2007 Anytao.com ,原创作品,转贴请注明作者和出处. 设计就像是转魔方,你必须面面俱到. ...

  8. 射频电路板设计常见的问题分析和解决办法

    射频电路板设计由于在理论上还有很多不确定性,因此常被形容为一种"黑色艺术",但这个观点只有部分正确,RF电路板设计也有许多可以遵循的准则和不应该被忽视的法则.     不过,在实际 ...

  9. 多任务多目标 CTR 预估技术

    一 背景 1 多任务多目标学习 多任务(Multi Task Learning)是深度学习时代非常普遍的建模方式.在NLP.CV.CTR诸多领域有非常广泛的应用. 多目标(Multi Objectiv ...

最新文章

  1. CentOS6.2 KVM 虚拟机命令行安装配置
  2. php商品分类显示商品,ecshop首页显示全部商品分类的方法
  3. 净误差与遗漏为负值的含义_巴丹吉林沙漠湖泊水位变化及地下水净补给量
  4. what is the location of js when using run as server in Eclipse
  5. matlab中云模型,云模型简介与个人理解matlab程序.doc
  6. Android平台RTSP轻量级服务|RTMP推送摄像头或屏幕之音频接口设计
  7. APPCAN学习笔记003---原生开发与HTML5技术
  8. orm2 中文文档 2. 设置
  9. 044、JVM实战总结:高级工程师的硬核技能:JVM的Young GC日志应该怎么看?
  10. Dynamic Performance Tables not accessible Automatic Statistics disabled for this session
  11. JavaWeb——springMVC入门程序
  12. L1-036 A乘以B (5 分)—团体程序设计天梯赛
  13. 游戏史上30位最有影响力的人物
  14. 无线认证 服务器是怎么回事,无线wifi认证服务器参数设置方法是什么
  15. 本科英语计算机,计算机本科生英语简历范文
  16. 神经网络权重是什么意思,神经网络权值和阈值
  17. iPhone投屏家中设备有哪些方法 iPhone投屏失败是怎么回事如何解决
  18. python训练好的图片验证_Python图片验证码降噪处理实例
  19. js以excel为模板的打印
  20. 【python做接口测试的学习记录day9——pytest自动化测试框架之yaml数据驱动封装】

热门文章

  1. 计算机科学家Erik Meijer眼中的Hacker Way工作方式
  2. 请大家说一说:有没有必要针对VSS备份过程,做成一个开源小工具?
  3. kibana7.10.1基本操作(饼图+直方图)
  4. 数据湖三种方案的流行度调查
  5. 云主机superset接入redis缓存
  6. SecureCRT出现 libpython2.7.so.1.0: cannot open shared object file
  7. django报错500排查方法
  8. intellij行数输出限制
  9. conky在ubuntu xfce4下面的配置
  10. Linux 向文件末尾追加命令(转载)