单线程系统中多线程程序的好处

时间:2014-01-29 10:16:31

标签: c++ multithreading processor

我的教授因果提到我们应该编写多线程程序,即使我们使用的是单核处理器,但由于时间不够,他没有详细说明。

我想知道单线程处理器中多线程程序有什么好处?

9 个答案:

答案 0 :(得分:2)

某些应用需要是多线程的。多线程不仅仅是通过使用更多内核来提高性能,还可以同时执行多个任务。

以Skype为例 - GUI需要能够接受您输入的文本,将其显示在屏幕上,收听来自您正在与之交谈的用户的新消息并显示它们。这在单线程应用程序中不是一项微不足道的任务。

即使只有一个核心可用,操作系统线程调度程序也会给你一种并行的假象。

答案 1 :(得分:2)

它不会像多核系统那样重要,但它仍然可以提供一些好处。

主要是您将获得的所有好处将涉及在已经执行的线程的输入未命中之后将发生的上下文切换。执行线程可能正在等待诸如硬件资源或分支错误预测之类的任何事情或甚至在高速缓存未命中之后的数据传输。

此时可以执行等待线程以从这个“等待时间”中受益。但当然,上下文切换需要一些时间。管理代码中的线程而不是顺序计算也会给程序带来一些额外的复杂性。正如已经说过的,一些应用程序需要是多线程的,因此在某些情况下无法从上下文切换中逃脱。

答案 2 :(得分:1)

通常是关于不阻止。在单个核心上运行多个线程仍然会产生并发错觉。因此,您可以拥有一个执行IO的线程,而另一个执行用户交互。用户交互线程不会被阻塞而另一个执行IO,因此用户可以自由地进行交互。

答案 3 :(得分:1)

好处可能不同。 其中一个广泛使用的例子是GUI应用程序,它应该执行某种计算。如果您将拥有一个线程 - 用户必须在与应用程序交换其他内容之前等待结果,但如果您在单独的线程中启动它 - 用户界面在计算过程中仍然可供用户使用。因此,即使在单核系统上,多线程程序也可以模拟多任务环境。这是其中一个要点。

答案 4 :(得分:1)

正如其他人已经提到的,不阻止是一个应用程序。另一个是分离要同时执行的不相关任务的逻辑。使用线程可以将这些任务安排到操作系统。

但是,请注意,也可以在单个线程中使用异步操作实现类似的行为。 “Future”和boost :: asio提供了做无阻塞内容的方法,而不必使用多个线程。

答案 5 :(得分:1)

我认为这取决于你如何设计你的线程以及哪个逻辑实际上在线程中。您甚至可以在单个核心上获得一些好处:

  • 线程可以包含阻塞/长时间通话,否则无法绕过。对于某些操作,有轮询机制,但不适用于所有操作。
  • 一个线程可以包装几乎没有与其他代码交互的应用程序的独立部分。例如,用于更新的后台轮询,监视某些资源(例如,免费存储),检查互联网连接。如果将它们保存在一个单独的线程中,您可以在自己的“运行时”中保持代码相对简单,而不必过多关注对主程序的影响,与主逻辑的唯一通信通常是单个“事件”。
  • 在某些环境中,您可能会获得更多处理时间。这主要取决于您的操作系统调度系统的工作方式,但如果这为每个线程分配时间,您拥有的线程越多,您的应用程序的安排就越多。

长期的一些好处:

  • 如果您的硬件发展,那么您不难受益。你永远不知道会发生什么,今天你的应用程序在单核嵌入式设备上运行,明天嵌入式设备将获得四核。从一开始就进行线程编程可以提高您未来的可扩展性。
  • 一个例子是一个环境,你可以确定地为一个线程分配工作,例如基于某些散列,所有相关操作最终都在同一个线程中。单核的优势是“小”,但由于您需要很少的同步原语而不难做到这一点,因此开销很小。

那就是说,我认为有些情况是非常不好的建议:

  • 只要您与其他线程的所需同步机制变得复杂(例如,多个锁,许多关键部分,......)。当有效地转移到多个CPU时,多线程可能仍然可以带来好处,但是对于单核和编程时间来说,开销都很大。

答案 6 :(得分:0)

例如,考虑因外围设备速度较慢而阻塞的操作(硬盘访问等)。虽然这些都在等待,但即使是单核也可以不同寻常地做其他事情。

答案 7 :(得分:0)

在许多应用程序中,瓶颈不是CPU处理能力。因此,当程序流等待IO请求(用户输入,网络/磁盘IO),可用的关键资源或任何类型的异步触发事件的完成时,可以安排CPU执行其他工作而不仅仅是阻塞。

在这种情况下,您不一定需要多个可以并行运行的线程。我想到了asynchroneous IOcoroutinesfibers等合作多任务概念。

但是,如果应用程序的瓶颈是CPU处理能力(CPU使用率始终为100%),则增加应用程序可用的CPU数量是有意义的。此时,如果设计为预先并行运行,则可以更轻松地将应用程序扩展为使用更多CPU。

答案 8 :(得分:0)

据我所见,尚未给出一个答案:

将来必须编写多线程应用程序!

未来每18个月平均核心数量将翻一番。人们已经学习了50年的单线程编程,现在他们面临着具有多个内核的设备。多线程环境中的编程风格与单线程编程有很大不同。这指的是诸如避免竞争条件和正确同步之类的低级方面,以及诸如通用算法设计之类的高级方面。

因此,除了已经提到的要点之外,它还涉及编写面向未来的软件,可扩展性以及实现这些目标所需技能的开发。