2010-12-15 91 views
2

基本上,我想知道是否线程是有用的或必要的,或者更具体地说,您可以使用它的用途和情况。我不太了解线程,并且从来没有使用它(我主要使用C#),并且想知道如果使用它们,性能或稳定性是否有所提高。如果有人会如此善意解释,我将不胜感激。线程是否必要/有用?

回答

6

在桌面应用程序(我的域)中,线程是创建响应用户界面的重要构造。无论何时需要运行时间或计算密集型操作,几乎必须在单独的线程中运行该操作。否则,用户界面会锁定,并且在某些情况下,Windows会判定整个应用程序无响应。

线程也是动画,音频和通信中的重要工具。基本上,你发现自己需要立即做几件事的任何情况都适合使用线程。

+1

+1这是轶事,但在任何Windows机器上打开任务管理器。从视图菜单中,将线程列添加到进程选项卡。您将看到的是绝大多数进程(通常为90 +%)使用多个线程。在我的盒子里,76个(93%)正在运行的进程中有71个是多线程的。 – 2010-12-15 03:01:30

+0

@Matt Davis:只是为了统计:55/58通过这里;-) – zerkms 2010-12-15 03:13:07

0

下面是线程如何提高性能的一个简单示例。你有n个数字都需要加在一起。在单线程应用程序中,需要n个时间单位才能将所有数字加在一起以获得最终总和。但是,如果您将您的号码分成两组,则可以将相同的操作并排运行,每组都有一组n/2号码。每个会花费n/2个时间单位来找到他们各自的总和,然后再增加一个单位来找到全部总和。通过创建两个线程,可以有效地将计算时间减半。

+0

'这里加入'看起来不太合适的例子,imho,因为'+'是非常便宜的操作。我认为'视频压缩'可能会更好。 – zerkms 2010-12-15 02:58:16

+0

正确的是,视频压缩比添加要重得多。但是更容易看出每个加法操作是独立的,并且除了初等数学之外不需要知识就可以理解在执行时间中可能会有巨大收益这一点。一旦OP理解了基本概念,他就可以转向更复杂的例子,其中时间单位的大小更大。 – unholysampler 2010-12-15 03:11:55

+4

请注意,这里的假设是两个线程在两个不同的处理器上运行。如果线程轮流运行在*相同*处理器上,那么显然总时间*更长*因为您完成了所有相同的工作,以及线程间上下文切换的额外工作。理想情况下,您希望*每个处理器有一个线程*,并且每个线程都将使用最大100%的处理器;如果你没有这些,那么无论你是为解决它的问题买了太多的机器,还是把进程关在其他东西上,例如磁盘或网络访问。 – 2010-12-15 19:43:11

1

肯定没有稳定的收益:)。我建议你对线程有一个基本的了解,但是不要在实际的生产应用程序中使用它,除非你有真正的需求。你有C#所以不知道你是否建立网站或winforms。

通常,winforms的第一个线程用例是当用户单击按钮并且想要运行一些昂贵的操作(数据库或webservice调用)但您不希望屏幕冻结。 。

一个很好的教程来处理这种情况是look at the backgroundworker class in c#,因为这将让您在第一香味进入这个空间,然后你可以从那里

0

去技术上的单核处理器,有没有这样的东西多线程,只是因为每个任务获得少量时间,并行发生多个任务的错觉。

但是,这就是说,线程是非常有用的,如果你必须做一些需要很长时间的工作,但你希望你的应用程序能够响应(即能够做其他事情),而你等待该任务完。一个很好的例子是GUI应用程序。

多核/多处理器系统,你可以有一个过程,在一次这样的性能提升有明显的:)做很多事情

+1

即使在一个内核线程上,也可以加速应用程序的执行。例如,当您使用慢速第三方数据源(ftp,http,hdd等)时。 – zerkms 2010-12-15 02:56:30

1

曾经有一段时间,当我们部署我们的应用程序将加快他们在新的CPU上。而且这种加速在很大程度上是因为CPU速度(时钟)增加了很多因素。

但几年前,由于物理限制(例如散热),CPU制造商停止增加CPU时钟。相反,他们开始向CPU添加额外的内核。

现在,如果您的应用程序只在一个线程上运行,它就无法利用完整的CPU(例如4个内核只使用1个)。

因此,今天为了充分利用CPU,我们必须在多个步骤上花费精力和分工。 对于ASP.NET,ASP.NET架构和IIS已经为我们完成了。

看这里The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software

相关问题