有人可以解释一下编写在单个核心的单个处理器上运行的多线程代码是否有任何优势?例如,一种处理文档页面的方法,使得页面与上述代码段相互排斥。
乍一看,似乎没有优势,因为真正的多线程是不可能的。即,OS无论如何都必须上下文切换线程。我想知道是否只是以单线程方式编写代码实际上可能更有效率。
显然,有很多情况下编写多线程代码是有意义的,但同样,我的问题是当应用程序在单核处理器上运行时是否真的有这样做的优势。
编辑:请注意,我没有说“应用程序”而是“代码片段” - 请看上面的示例。显然,拥有多线程应用程序会带来好处。
答案 0 :(得分:12)
仍有优势可以获得,但它们有点情境化。
在许多情况下,给多个线程的东西将允许它从其他进程声明更多的系统资源。这很难平衡,你引入的每个线程都会增加一些开销,但这可能是一个原因。
如果您正在处理多个可能阻塞的资源 - 例如文件IO或GUI交互或诸如此类的东西,那么多线程可能至关重要。
答案 1 :(得分:11)
是的,多线程在单核中很有用。如果应用程序中的一个线程被阻塞等待某些东西(比如来自网卡的数据或等待磁盘写入数据),CPU可以切换到另一个线程继续工作。
即使在单核处理器的时代,BeOS也是以普及的多线程编写的。结果是一个非常敏感的操作系统,虽然是一个相当困难的操作系统。
答案 2 :(得分:4)
在单核处理器上,使用异步(非阻塞)I / O的应用程序比使用多个阻塞线程的应用程序稍微高效,因为它避免了线程之间上下文切换的开销。
此外,异步I / O比在线程中阻塞I / O更好,因为与创建新线程的开销相比,每个额外I / O操作的开销最小。
话虽如此,您通常不应在新应用程序中使用单线程异步I / O,因为几乎所有新处理器都是多核的。相反,你仍然应该使用异步I / O,但是使用类似线程池的东西在一组工作线程之间拆分工作。您的系统文档将告诉您理想的工作线程数;通常它等于可用的处理核心数。
编辑: 至少在Windows平台上,async/await pattern in .NET是执行异步I / O的现代方法。它使这个模式像旧的阻塞I / O模式一样容易编写。现在几乎没有理由编写阻塞I / O.