1

我目前正在学习多线程、线程、线程池等。我已经读过线程的数量不能超过您计算机拥有的逻辑处理器的数量(或者至少没有任何优势,因为您的 CPU 无法处理更多)。

那么,如果您编写的代码在具有 12 个逻辑处理器的计算机上创建了数百个线程,那么预期的行为是什么?他们排队吗?他们会互相等待吗?或者它会给你一个错误?如果您的进程可以从 100 个连续运行的线程中受益,但只有 12 个内核,那么处理这个问题的最佳方法是什么?我经常打开我的任务管理器,看到数百个进程和数千个线程正在运行。这是如何运作的?

另外,如果我在 Windows 中运行一个程序,同时运行一堆其他应用程序(即 Chrome、MS Excel、Skype 等),也许还有一堆后台服务(即 Windows Defender、 Wifi 服务等...)这些其他应用程序是否占用了逻辑处理器,从而减少了我的线程程序可用的逻辑处理器数量?

4

2 回答 2

2

如果所有线程都只进行 CPU 繁重的计算,那么是的,拥有比 CPU 更多的线程没有多大意义(至少在性能方面,无论如何在架构上可能是好的)。

但是,许多任务涉及 I/O,其中大部分时间都花在等待某些设备返回数据上。我的意思是大多数时候。轻松超过90%。在这些情况下,CPU 有其他事情要做会很好。

他们排队吗?他们会互相等待吗?

调度和跟踪它们是操作系统的责任。通常线程是时间片的,你也可以分配优先级。同样,一旦线程进入等待状态,操作系统就可以在 CPU 上运行不同的线程。

于 2016-04-20T00:03:08.483 回答
1

正如 Thilo 所暗示的那样,现代个人计算机在任何给定的时间片断都在不断地创建、执行和销毁数十个甚至数百个线程/进程。CPU上实际处理的线程数不能超过逻辑核数,但这并不意味着不能有更多的线程等待执行。

如果您编写的代码在具有 12 个逻辑处理器的计算机上创建了数百个线程,那么预期的行为是什么?

如果我们假设用于创建这些线程的环境(框架、平台、语言、操作系统、硬件)可以支持的并发线程多于多个并发线程,那么结果将是每个线程都由操作系统根据数量调度可用内核的数量以及这些线程相对于其他正在运行的线程/进程的优先级。此行为可能因特定操作系统、工具集、程序类型(Windows 上的内核模式/用户模式)和运行代码的硬件而有很大差异。

附带说明一下,使用传统线程可能很昂贵,因为它强制处理器进行上下文切换(刷新缓存、加载新上下文、执行)。在解决特定问题时,还有其他技术可以在一定程度上解决这个问题(例如 .Net 的任务并行库或 C++ 的并行模式库)。

如果您的进程可以从 100 个连续运行的线程中受益,但只有 12 个内核,那么处理这个问题的最佳方法是什么?

这取决于手头的任务和您工作的环境。异步编程是计算机科学中一个非常大的话题,因此,有大量可用的技术和库 - 每一种都有其优点和缺点。

于 2016-04-20T01:12:26.750 回答