何时使用多线程?

20

在应用程序中什么时候使用线程?例如,在简单的CRUD操作中、使用SMTP、调用Web服务(如果服务器面临带宽问题可能需要一些时间等)。

说实话,我不知道如何确定是否需要使用线程(我知道必须在我们期望操作将需要一些时间完成时这样做)。

这可能是一个“初学者”问题,但如果您与我分享有关线程的经验,那将是太好了。

谢谢


你实际上想要做什么?告诉我们线程是否有助于解决你的问题更容易回答。否则,这个问题看起来像是“关闭因不是一个真正的问题”的候选人。 - David Heffernan
我需要研究多线程的使用,因为我的团队领导要求这样做。但是首先我正在尝试弄清楚何时应该使用线程,这就是我提出这个问题的原因。为了看看其他开发人员在“真实世界应用程序”中如何使用线程。 - Gui
我喜欢从资源角度来看待多线程场景。换句话说,UI(图形)、网络、磁盘IO、CPU(核心)、RAM等等。我发现这有助于在一般意义上决定何时使用多线程。顺便说一句,这是个很好的问题,无论你是新手还是老手 :-) - bic
好的,现在一切清楚了。对我来说,我使用线程使得我的CPU绑定的数值分析程序可以充分利用可用的处理器。 - David Heffernan
5
4年前我提出这个问题,现在我正在用PHP解决它。回顾过去,看到我们在知识方面的成长,真是受益于像这样的社区。 - Gui
6个回答

9
我在你的问题中添加了C#和.NET标签,因为你在标题中提到了C#。如果这不准确,请随时删除标签。
有不同风格的多线程。例如,有带回调函数的异步操作。.NET 4引入了并行Linq库。您将使用哪种多线程风格,或者是否使用任何多线程,取决于您想要实现什么。
并行执行,例如并行Linq通常尝试执行的操作,利用多个处理器核心执行彼此不需要等待数据的指令。除了Linq之外,还有许多这样的算法来源,例如这里。然而,可能并行执行对您无效,或者它不适合您的应用程序。
更传统的多线程利用.NET库(在本例中)内的线程,由System.Thread提供。请记住,在启动线程上存在一些开销,因此只有当使用线程的优点超过此开销时才使用线程。一般来说,您只想在任务在线程下运行时具有长时间间隔的情况下使用这种类型的单处理器多线程。例如,硬盘I/O(因此,使用硬盘的数据库系统)比内存访问慢几个数量级。网络访问也可能很慢,例如。多线程可以在等待这些慢速(相对于处理器)操作完成时运行另一个进程。
我使用传统的多线程的另一个例子是,在会话中第一次访问特定ASP.NET页面时缓存某些值。我启动一个线程,以便用户在与页面交互之前不必等待缓存完成。我还调节了当缓存在用户请求另一页之前未完成时的行为,以便如果缓存未完成,则不是问题。它只是使一些先前太慢的进一步请求更快。
还要考虑多线程对应用程序可维护性的成本。例如,线程应用程序可能更难调试。
希望这至少在一定程度上回答了您的问题。

使用.NET进行并行编程封装了多线程吗?这样说是正确的吗? - RollRoll
@EdwinSnts 我不完全确定你在问什么。无论是由并行Linq还是其他方式创建的多个线程,都可能在不同的处理器核心上运行。这是你想要的吗? - Andrew
这是否意味着如果我不使用并行LINQ,我的代码指令将只在一个核心上执行?即使托管它的计算机具有多核处理器? - RollRoll
抱歉,可能是另一个问题,我会发布它。 - RollRoll

2

Joseph Albahari 在这里非常好地总结了:

  • 维护响应迅速的用户界面
  • 充分利用被阻塞的 CPU
  • 并行编程
  • 推测性执行
  • 允许请求同时处理

1

使用线程的一个原因是将大型CPU绑定任务分割到多个CPU/核心上,以更快地完成。另一个原因是让扩展任务异步执行,这样前台可以保持响应而不会被阻塞。

您的示例似乎集中在这两者中的第二个。虽然这可能是一个很好的理由,但如果您可以使用异步I/O,那通常更可取(例如,几乎所有使用套接字的东西都可以/将更适合使用异步套接字)。异步I/O更容易取消,并且通常也具有较低的CPU开销。


1

当你需要不同的执行路径时,可以使用线程。这会导致(如果正确执行)更具响应性和/或更快的应用程序,但也会导致更复杂的代码和调试。

在简单的CRUD场景中,可能没有那么有用,但是也许您的UI正在消耗缓慢的Web服务。如果您的代码绑定到UI线程,则在服务调用之间会出现无响应的UI。

在这种情况下,使用System.Threading.Threads可能过度,因为您不需要那么多控制。使用BackgrounWorker可能是更好的选择。

线程是一些难以掌握的东西,但是当正确使用时,其好处是巨大的,性能是最常见的。


1

你已经自己回答了你的问题。每当执行耗时操作时使用线程是正确的选择。同时在想要加快速度的情况下也应该使用线程。例如,你想处理一些文件-每个文件可以由不同的线程处理。

通过使用线程,你可以更好地利用多核/处理器机器的能力。

在应用程序的后台监视某些数据。

有数十种这样的情景。


0

意译:我意识到我的评论可能已经足够作为一个答案了...

我喜欢从资源的角度来看待多线程场景。换句话说,UI(图形)、网络、磁盘IO、CPU(核心)、RAM等等。至少在一般情况下,我发现这有助于决定何时使用多线程。

这背后的原因很简单,我可以利用一个特定线程上的一个资源(例如磁盘IO),同时使用另一个线程来完成使用不同资源的其他任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接