Multithreading 多核系统上并行问题之外的线程有什么用?

Multithreading 多核系统上并行问题之外的线程有什么用?,multithreading,language-agnostic,concurrency,Multithreading,Language Agnostic,Concurrency,线程使程序的设计、实现和调试变得更加困难 然而,许多人似乎认为程序中可以线程化的每个任务都应该线程化,即使是在单核系统上 我能理解在多核cpu上运行的MPEG2解码器之类的线程(我已经做到了),但是,如果您的任务没有从并行实现中获得显著的性能,那么当您谈论单核系统甚至多核系统时,线程化所带来的巨大开发成本又有什么理由呢 或者更简单地说,什么类型的非性能相关问题可以证明线程化 编辑 我刚刚遇到了一个不受CPU限制的实例,但是线程有很大的不同: 当试图通过高延迟网络连接将带宽最大化到另一个对等方时

线程使程序的设计、实现和调试变得更加困难

然而,许多人似乎认为程序中可以线程化的每个任务都应该线程化,即使是在单核系统上

我能理解在多核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,我可以通过信号和信号处理程序获得异步通知,在我看来,这比处理线程简单得多。在信号处理程序中,您可以做的事情是有限的(我倾向于只做