单线程到多线程的应用程序

时间:2010-01-30 18:10:28

标签: multithreading language-agnostic

什么时候应该在我们的应用程序中使用线程。换句话说,何时应该将单线程应用程序转换为多线程应用程序。 作为开发人员,我认为阻止您的应用程序顺利运行的任务。该任务可以由线程处理。就像我们不断获得GPS数据一样。 我认为,还有其他更多的理由在您的应用程序中创建线程。请分享您的意见。

感谢。

6 个答案:

答案 0 :(得分:4)

我能想到的最好的理由(我确信还有更多)是:
1.将一批工作卸载到工作线程,以便程序可以继续响应用户输入,或者继续运行不依赖于该工作的其他代码。
2.处理I / O,特别是响应时间可变或未知的服务器和网络通信 3.数据的并行处理,您可以将工作细分为离散的非依赖工作单元 4.定时器相关的工作,即“每500ms检查x是否已经改变”

然而,切换到多线程或并发编程并非没有它的缺陷,特别是如果这些线程需要访问共享数据,因此有关mutexesthread synchronisation的SO问题的数量!

答案 1 :(得分:2)

有一个很好的理由,“转换”是多核机器正变得越来越规范,它是相当可悲的老节目差强人意,因为他们只有一个核心工作。

我有一个数字运算应用程序,其中一部分在Mac上非常慢,具有16个虚拟核心,用于所需(通常称为)排序算法仅在一个核心上运行。我实现了自己的多线程排序算法,以适应核心和宾果游戏的数量,以及惊人的加速。

使用CPU监视器可以清楚地看到这种非常不优化的行为。

所以回答你的问题“我们什么时候应该使用线程?”简单地说“当你通过使它只在一个核心上运行来人为地减慢你的软件速度”时。

作为旁注,它非常有趣,因为在这个例子中,排序算法的复杂性保持为O(n log n),但“并行化效果”提供了惊人的速度提升。

其他原因可能是在某些情况下正确地多线程化您的应用程序,例如使用经过深思熟虑的procuder / consumer方案,也可以帮助减少某种资源争用。

答案 2 :(得分:2)

线程的一个很好的用途是解开不同的问题空间。例如,如果单个线程进行远程通信,用户交互和计算,那么随着程序的增长,可能会出现一些问题。随着通信速度变慢或计算在处理器周期消耗中增长,用户体验可能会发生变化。

通过将代码的通信,用户和算法部分(一个简短列表,特别是如果您正在进行实时系统)分离到自己的线程中,可以提高代码的模块性和可理解性,降低可能性因不可预见的后果而引入错误,您可以控制执行优先级和同步。

我最近使用的应用程序使用线程进行日期时间管理,通信,GUI,定期远程请求,运动控制和监视器。

当然,多线程确实有自己的问题,特别是竞争条件和超出预期序列的事情,但这些都可以通过信号量,互斥量等来管理。

答案 3 :(得分:1)

一般的想法是,当某些事情可以并行完成时,可能可以从使用多个线程中受益(并且您需要使用多个核心。)请考虑embarrassingly parallel个问题。这里的目的是在同一时间内完成更多工作。阅读H. Sutter关于Effective Concurrency的文章。

人们经常将用户界面响应连接到线程。这不一定是这种情况,取决于特定OS / framework / API的功能,但常见的用法是在后台线程中执行冗长的操作,如文件打开/保存,这样UI就不会在该操作的持续时间内冻结。 / p>

线程 required 的另一种情况是,当你处理说内部使用线程的供应商库(消息产品等)时,你别无选择,只能明确地处理线程。

虽然多线程不是火箭科学,但很难。获得诸如竞争条件死锁优先级反转内存模型等基础知识的时间非常长海峡在你脑海里。

答案 4 :(得分:1)

多线程的主要用途是,当有一个 并行代码流的要求。

我能给出的最好的例子是破球者比赛, 你必须运行动​​画才能显示球 移动并从用户那里获取输入以移动球棒。

在这里,您将在线程上运行动画并与之交互 其他线程上的用户。单个线程应用程序无法解决这个问题。

答案 5 :(得分:0)

OldEnthusiast非常正确,利用核心是使用线程的一个原因。但是,即使您运行的是不是非核心的旧硬件,仍然有理由进行处理。如果您需要允许用户在程序执行冗长的任务时保持对UI的控制,那就是这样。您的程序可以将任务(例如处理文件或从网络中提取某些内容)拆分到线程上,并且仍然允许用户与程序交互,比如排队另一个作业。