首页 > 解决方案 > 我可以在 C 程序中创建多少个线程,它与我的 CPU 拥有的线程数有什么关系?

问题描述

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

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

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

在此处输入图像描述

,这意味着我的理解是错误的。

所以我的问题是:

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

标签: cmultithreadingpthreadscpu

解决方案


Intel CPU 的核心是每个核心有多个执行单元。一块主板可以有很多CPU。

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

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

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

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

有趣的读物:


推荐阅读