我的教授因果提到我们应该编写多线程程序,即使我们使用的是单核处理器,但由于时间不够,他没有详细说明。
我想知道单线程处理器中多线程程序有什么好处?
答案 0 :(得分:2)
某些应用需要是多线程的。多线程不仅仅是通过使用更多内核来提高性能,还可以同时执行多个任务。
以Skype为例 - GUI需要能够接受您输入的文本,将其显示在屏幕上,收听来自您正在与之交谈的用户的新消息并显示它们。这在单线程应用程序中不是一项微不足道的任务。
即使只有一个核心可用,操作系统线程调度程序也会给你一种并行的假象。
答案 1 :(得分:2)
它不会像多核系统那样重要,但它仍然可以提供一些好处。
主要是您将获得的所有好处将涉及在已经执行的线程的输入未命中之后将发生的上下文切换。执行线程可能正在等待诸如硬件资源或分支错误预测之类的任何事情或甚至在高速缓存未命中之后的数据传输。
此时可以执行等待线程以从这个“等待时间”中受益。但当然,上下文切换需要一些时间。管理代码中的线程而不是顺序计算也会给程序带来一些额外的复杂性。正如已经说过的,一些应用程序需要是多线程的,因此在某些情况下无法从上下文切换中逃脱。
答案 2 :(得分:1)
通常是关于不阻止。在单个核心上运行多个线程仍然会产生并发错觉。因此,您可以拥有一个执行IO的线程,而另一个执行用户交互。用户交互线程不会被阻塞而另一个执行IO,因此用户可以自由地进行交互。
答案 3 :(得分:1)
好处可能不同。 其中一个广泛使用的例子是GUI应用程序,它应该执行某种计算。如果您将拥有一个线程 - 用户必须在与应用程序交换其他内容之前等待结果,但如果您在单独的线程中启动它 - 用户界面在计算过程中仍然可供用户使用。因此,即使在单核系统上,多线程程序也可以模拟多任务环境。这是其中一个要点。
答案 4 :(得分:1)
正如其他人已经提到的,不阻止是一个应用程序。另一个是分离要同时执行的不相关任务的逻辑。使用线程可以将这些任务安排到操作系统。
但是,请注意,也可以在单个线程中使用异步操作实现类似的行为。 “Future”和boost :: asio提供了做无阻塞内容的方法,而不必使用多个线程。
答案 5 :(得分:1)
我认为这取决于你如何设计你的线程以及哪个逻辑实际上在线程中。您甚至可以在单个核心上获得一些好处:
长期的一些好处:
那就是说,我认为有些情况是非常不好的建议:
答案 6 :(得分:0)
例如,考虑因外围设备速度较慢而阻塞的操作(硬盘访问等)。虽然这些都在等待,但即使是单核也可以不同寻常地做其他事情。
答案 7 :(得分:0)
在许多应用程序中,瓶颈不是CPU处理能力。因此,当程序流等待IO请求(用户输入,网络/磁盘IO),可用的关键资源或任何类型的异步触发事件的完成时,可以安排CPU执行其他工作而不仅仅是阻塞。
在这种情况下,您不一定需要多个可以并行运行的线程。我想到了asynchroneous IO,coroutines或fibers等合作多任务概念。
但是,如果应用程序的瓶颈是CPU处理能力(CPU使用率始终为100%),则增加应用程序可用的CPU数量是有意义的。此时,如果设计为预先并行运行,则可以更轻松地将应用程序扩展为使用更多CPU。
答案 8 :(得分:0)
据我所见,尚未给出一个答案:
将来必须编写多线程应用程序!
未来每18个月平均核心数量将翻一番。人们已经学习了50年的单线程编程,现在他们面临着具有多个内核的设备。多线程环境中的编程风格与单线程编程有很大不同。这指的是诸如避免竞争条件和正确同步之类的低级方面,以及诸如通用算法设计之类的高级方面。
因此,除了已经提到的要点之外,它还涉及编写面向未来的软件,可扩展性以及实现这些目标所需技能的开发。