Multithreading 多核系统上并行问题之外的线程有什么用?
线程使程序的设计、实现和调试变得更加困难 然而,许多人似乎认为程序中可以线程化的每个任务都应该线程化,即使是在单核系统上 我能理解在多核cpu上运行的MPEG2解码器之类的线程(我已经做到了),但是,如果您的任务没有从并行实现中获得显著的性能,那么当您谈论单核系统甚至多核系统时,线程化所带来的巨大开发成本又有什么理由呢 或者更简单地说,什么类型的非性能相关问题可以证明线程化 编辑 我刚刚遇到了一个不受CPU限制的实例,但是线程有很大的不同:Multithreading 多核系统上并行问题之外的线程有什么用?,multithreading,language-agnostic,concurrency,Multithreading,Language Agnostic,Concurrency,线程使程序的设计、实现和调试变得更加困难 然而,许多人似乎认为程序中可以线程化的每个任务都应该线程化,即使是在单核系统上 我能理解在多核cpu上运行的MPEG2解码器之类的线程(我已经做到了),但是,如果您的任务没有从并行实现中获得显著的性能,那么当您谈论单核系统甚至多核系统时,线程化所带来的巨大开发成本又有什么理由呢 或者更简单地说,什么类型的非性能相关问题可以证明线程化 编辑 我刚刚遇到了一个不受CPU限制的实例,但是线程有很大的不同: 当试图通过高延迟网络连接将带宽最大化到另一个对等方时
当试图通过高延迟网络连接将带宽最大化到另一个对等方时,多线程非常有用。非阻塞I/O将大大减少本地CPU资源的使用,但设计和实现起来要困难得多。例如,在不阻塞用户界面的情况下执行CPU密集型任务 然而,许多人似乎认为 程序中的每个任务都可以 螺纹应该是螺纹的,即使是在 单核系统 “很多人”。。。谁 根据我的经验,很多应该是多线程的程序都不是(特别是游戏。我有一个i7,但大多数游戏仍然只使用我的一个内核),所以我不确定你在说什么。像
calc.exe
这样的程序肯定不是多线程的(或者,如果是多线程的话,一个线程完成99%的工作)
执行CPU密集型任务 在不阻塞用户界面的情况下, 比如说
是的,这是正确的,但这相当容易实现,并且不是OP所指的(因为在本例中,1个线程几乎完成所有工作,您只需要很少的互斥)一个有趣的例子是Web服务器——您需要能够处理多个相互无关的传入连接 哪些类型的非绩效相关 问题证明线程是正确的
Web应用程序就是典型的例子。每个用户请求在概念上都是一个新线程。与性能无关,它只是一种自然的适合设计。任何您可能正在等待资源的应用程序(例如,阻止来自网络套接字或磁盘设备的I/O)都可以从线程中获益 在这种情况下,当其他线程继续运行时(包括在某些操作系统下的GUI线程,如果操作系统暂时无法与它联系,它将为用户提供销毁它的机会,认为它不知何故处于死锁状态)
因此,这不仅仅适用于多核机器。这里有几个具体而简单的场景,我在其中启动了线程
我同意仅仅为了线程化而线程化不是一个好主意,如果处理不当,它可能会在应用程序中引入问题,但它是解决一些问题的一个非常有用的工具。每当您需要调用某个外部组件时(无论是数据库查询、3.party库、操作系统原语等)这只提供了一个同步/阻塞接口或使用异步接口,不值得额外的麻烦和痛苦,而且您还需要某种形式的并发性,例如,为服务器中的多个客户端提供服务或保持GUI的响应性。阻塞代码通常更易于编写和读取(因此也更易于维护)而非阻塞代码。然而,使用阻塞代码将您限制为单一执行路径,并且还锁定了诸如用户界面(前面提到)和其他IO端口之类的内容。在这些情况下,线程是一个优雅的解决方案
考虑多线程的另一种情况是,当您有几个应该管理的接近同步的IO通道时:使用多线程(通常是本地消息队列)可以获得更清晰的代码。那么,您如何知道您的应用程序是否要在多核系统上运行呢
除此之外,还有许多进程占用时间,但不需要CPU。例如写入磁盘或网络。谁想在GUI中按下一个按钮,然后坐在那里等待网络连接。即使在单核机器上,使用单独的IO线程也可以极大地改善用户体验。您总是希望UI至少有一个单独的线程 这是我想到的情景之一。但传统上,你只需要解决这类问题。据我所知,Apache2从分叉切换到线程,但实际上,由于Linux上的进程和线程几乎相同且成本相等,因此它们在这方面的ROI有多大?也许,但对于I/O,我可以通过信号和信号处理程序获得异步通知,在我看来,这比处理线程简单得多。在信号处理程序中,您可以做的事情是有限的(我倾向于只做