2013-12-09 49 views
14

能有人请解释,如果有任何好处真的编写多线程的一段代码,与单核单处理器上运行?例如,处理文档页面的方法,使得页面与上述代码段相互排斥。单对多线程的单核处理器的编程

乍一看,它似乎并不像有会是一个优势,因为真正的多线程是不可能的。即,操作系统将不得不上下文切换线程。我想知道,如果仅以单线程方式编写代码实际上可能会更有效。很显然,编写多线程代码很有意义的情况很多,但是我的问题是,当应用程序在单核处理器上运行时,是否真的有这样的优势。

编辑:请注意,我没有说“应用程序”,而是“代码片” - 看看我上面的示例。显然有一个多线程应用程序的好处。

+3

你可以有线程等待文件加载,网络数据来,即使只有一个人可以一次使用处理器。 – zch

+2

正如@zch指出的那样,即使在单个内核上,IO绑定的应用程序也可以利用多线程优势,尽管你永远不会获得超过2倍的加速比(如果IO变得太过瓶颈,CPU加速将不会阿米达尔定律)。更常见的原因是设计多线程应用程序,即使您目前只有1个内核,也是为了在多核心可用时轻松移植多核。设计一次应用程序会更好,而不会硬编码当前的硬件限制,然后在有更多硬件资源可用时重新编写应用程序。 – Michael

+1

@Michael我会同意,如果您确信您最终将移植到多核系统,但现在由于您未来可能需要处理的事情而使您的代码更复杂是不值得的。 –

回答

11

仍然有优势可以获得,但他们有点情境化。

  • 在许多情况下,给这个东西多个线程将允许它从其他进程申请更多的系统资源。这很平衡,你介绍的每个线程都会增加一些开销,但这可能是一个原因。

  • 如果要处理多个可能阻塞资源 - 如文件IO或GUI交互或诸如此类的东西,那么多线程可以是至关重要的。

+1

我不认为它们没有什么意义,特别是给出了项目符号列表中的第二项。尽管如此,还是很不错的。 +1。 – Renan

+0

@Ranan好点。编辑。 –

10

是的,多线程在单核中很有用。如果应用程序中的某个线程被阻塞等待某些事情(比如说来自网卡的数据或等待磁盘写入数据),则CPU可以切换到另一个线程继续工作。

BeOS的的设计考虑了普遍的多线程写的,即使在单核处理器的时间。结果是一个非常敏感的操作系统,虽然是一个相当困难的操作系统来编程。

+0

好帖子!只是好奇,多线程应用程序可以利用os中的其他内核吗? (例如JXcore的NodeJS分支) –

2

在单核处理器,使用异步(非阻塞)的应用程序的I/O将略多于一个使用多个阻塞线程更有效的,因为它避免了上下文线程之间进行切换的开销。

此外,异步I/O扩展比线程阻塞I/O,因为相比于创建一个新线程的开销,每额外的I/O操作的开销是最小的更好。

说了这么多,你不应该一般使用单线程异步I/O在新的应用程序,因为几乎所有的新处理器的多核。相反,您仍然应该使用异步I/O,但使用类似线程池的方式将工作分配到一组工作线程中。您的系统文档将告诉您理想的工作线程数量;通常它等于可用的处理内核的数量。