什么时候应该在我们的应用程序中使用线程。换句话说,何时应该将单线程应用程序转换为多线程应用程序。 作为开发人员,我认为阻止您的应用程序顺利运行的任务。该任务可以由线程处理。就像我们不断获得GPS数据一样。 我认为,还有其他更多的理由在您的应用程序中创建线程。请分享您的意见。
感谢。
答案 0 :(得分:4)
我能想到的最好的理由(我确信还有更多)是:
1.将一批工作卸载到工作线程,以便程序可以继续响应用户输入,或者继续运行不依赖于该工作的其他代码。
2.处理I / O,特别是响应时间可变或未知的服务器和网络通信
3.数据的并行处理,您可以将工作细分为离散的非依赖工作单元
4.定时器相关的工作,即“每500ms检查x是否已经改变”
然而,切换到多线程或并发编程并非没有它的缺陷,特别是如果这些线程需要访问共享数据,因此有关mutexes和thread 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的控制,那就是这样。您的程序可以将任务(例如处理文件或从网络中提取某些内容)拆分到线程上,并且仍然允许用户与程序交互,比如排队另一个作业。