我可以在 C 程序中创建多少个线程,它与我的 CPU 拥有的线程数有什么关系?

How many threads can I create inside a C program and how does it relate to the number of threads my CPU has?

我的 CPU 是一个 i5-8400,它有 6 个内核和 6 个线程。这是什么意思?最初,我认为这意味着每个内核有 6 个线程可用,总共 36 个线程。

假设我正在制作一个 C 程序,我在其中创建了 pthreads,这是否意味着我在该程序中只能有 6 个线程,因为它的进程将 运行 在单个 CPU 核心上?如果是这样的话,如果我尝试创建第七个线程会发生什么?

当我转到任务管理器 (windows) 时,我看到了数千个线程:

,说明我理解错了

所以我的问题是:

  1. 我的 CPU 线程数与我在一个进程中可以创建的线程数有何关系,即假设我创建了一个 C 程序;我可以在其进程中创建多少个线程?
  2. 如果我尝试创建一个线程,但没有更多线程可用,会发生什么情况?

英特尔 CPU 有内核,每个内核有多个执行单元。一块主板可以有很多CPU.

例如,我的系统有 2 个 Intel Xeon E5620 处理器。每个 Xeon E5620 有 4 个核心,每个核心可以执行 2 个线程(即 超线程 功能)。在我的系统上,总共可以同时执行 2x4x2=16 个线程。

线程数和核心数之间存在差异是因为CPU有不完整的核心,可以执行多个线程,但性能不如完整的核心。换句话说,8核单线程比4核双线程快

当我们谈论 CPU 上下文中的线程数时,这意味着您可以让这么多线程真正并行执行。当您查看任务管理器时,您会看到系统中线程对象的总数。在给定的时刻,它们中的大多数都在休眠(例如等待 I/O 或互斥锁,...)只有 CPU 的线程数乘以 CPU 的数量可以真正执行指令。

如果您创建的线程多于可用 CPU 中可用的线程,那么其中的一部分只是在等待轮到它们执行。一个 CPU 线程一个接一个地执行现有线程。实际上,操作系统有一个调度程序来确定哪个线程准备好 运行 或不。

有趣的读物: