2010-01-30 33 views
1

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

谢谢。

+0

让它更具可读性,请。 这很难理解。 – oneat 2010-01-30 18:19:34

+1

我认为他基本上想知道将单线程应用程序转换为多线程应用程序会有哪些激励措施。他的问题的最后一句话是要理解的“最简单”。 – SyntaxT3rr0r 2010-01-30 18:25:46

+1

@oneat,根据他们的个人资料“读者”来自新德里,所以英语不是他们的“第一”语言,因此不完美的语法。假设某人的第一语言可能不是英语,这绝不会令人伤心。 =) – Rob 2010-01-30 18:44:32

回答

3

我可以从头顶上想到的理由(我敢肯定还有更多的)是:
1.将一批工作卸载到工作线程,以便您的程序可以继续响应用户输入或者,您可以继续运行其他不依赖于该工作的代码。
2.处理I/O,尤其是响应时间可变或未知的服务器和网络通信。
3.数据的并行处理,其中可以子分工向下进入工作的分立的非依赖单位
4.定时器相关的工作即“每500ms检查如果x已经改变”

然而,切换到多线程或并发编程并非没有缺陷,特别是如果这些线程需要访问共享数据,那么SO上的问题数量大约为mutexesthread synchronisation

+0

是的,这就是我正在寻找的答案...... :) – Reader 2010-01-31 06:17:52

2

“转换”的一个很好的理由是,多核心机器已经成为标准,看到旧程序执行不力,因为他们只在一个核心上工作,这让人非常难过。

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

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

因此,您的问题的一个答案是“我们应该何时使用线程?”简直就是“当你通过使软件只运行在一个核心上而人为地减慢你的软件速度”。

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

其他原因可能是,在某些情况下,正确地对应用程序进行多线程处理,例如通过使用精心设计的procuder/consumer方案,也可以帮助减少某种资源争用。

1

总的想法是,你可能可能受益于使用多个线程时,可以并行完成某些事情(并且你有多个核心可以使用。)认为embarrassingly parallel问题。这里的目的是做更多在同一时间内工作。阅读H. Sutter关于Effective Concurrency的文章。

人们经常将用户界面响应连接到线程。这不一定是这种情况,取决于特定OS/framework/API的设施,但常见用法是执行冗长的操作,如在后台线程中打开/保存文件,以便UI在该操作期间不冻结。

线程为要求的另一种情况是当您处理说在内部使用线程的供应商库(消息传递产品等)时,您无法明确地处理线程。

虽然多线程不是火箭科学,但它很难。付出总有回报大的时间才能拿到基本如竞争条件死锁优先级反转内存模型两岸在你的头上。

0

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

2

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

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

最近,我上的日期,时间管理,通信,GUI,定期远程请求,运动控制和监管机构使用的线程工作的一个应用。

当然,多线程不来有自己的问题,特别是竞争条件和事情发生了预期的序列,但这些都是管理与信号量,互斥等。

1

多线程的主要用途是,当存在用于并行代码 要求流动。

我可以给出的最佳例子是破球游戏 ,其中您必须运行动​​画以显示球移动并从用户处获取输入来移动球棒。

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