c - 我可以在 C 程序中创建多少个线程,它与我的 CPU 拥有的线程数有什么关系?
问题描述
我的 CPU 是i5-8400,它有6
内核和6
线程。这是什么意思?最初,我认为这意味着每个内核有 6 个线程可用,即36
线程总数。
假设我正在创建一个C
程序,我在哪里创建pthreads
,这是否意味着我只能6
在该程序中拥有线程,因为它的进程将在单个 CPU 内核上运行?如果是这样,如果我尝试创建第七个线程会发生什么?
当我转到任务管理器(Windows)时,我看到了数千个线程:
,这意味着我的理解是错误的。
所以我的问题是:
- 我的 CPU 线程数与我在一个进程中可以创建多少线程有什么关系,比如我创建了一个
C
程序;我可以在其进程中创建多少个线程? - 如果我尝试创建一个线程,但没有更多线程可用,会发生什么?
解决方案
Intel CPU 的核心是每个核心有多个执行单元。一块主板可以有很多CPU。
例如,我的系统有 2 个 Intel Xeon E5620 处理器。每个 Xeon E5620 有 4 个核心,每个核心可以执行 2 个线程(即超线程功能)。在我的系统上,总共可以同时执行 2x4x2=16 个线程)。
线程数和内核数之间存在差异是因为CPU具有不完整的内核,可以执行多个线程但性能不如完整的内核。换句话说,8核单线程比4核双线程要快。
当我们谈论 CPU 上下文中的线程数时,这意味着您可以让如此多的线程真正并行执行。当您查看任务管理器时,您会看到系统中线程对象的总数。在给定的时刻,它们中的大多数都在休眠(例如等待 I/O 或互斥锁,...)只有给定的 CPU 线程数乘以 CPU 的数量才能真正执行指令。
如果您创建的线程多于可用 CPU 中的可用线程,那么它们中的一部分只是在等待轮到它们执行。CPU线程一个接一个地执行现有线程。实际上,操作系统有一个调度程序来确定哪个线程准备好运行。
有趣的读物:
推荐阅读
- javascript - JSON.parse(): SyntaxError: Unexpected token � in JSON at position 0
- vba - 复制工作表,将其移动到特定工作表之后,根据另一个工作表中的单元格重命名并粘贴特殊值
- react-native - React native expo 在构建时弹出 ios lottie 错误
- python-3.x - Python同步stdout和stderr输出
- ruby-on-rails-6 - 添加 sass loader npm 包后,Webpacker 编译失败
- python - Python列表值显示在html表中
- reactjs - 如何从特定时间开始视频?
- javascript - 如果我使用“隐藏”选项,是否有一个选项可以在某个级别过滤一行,然后进一步扩展到较低级别?
- android - firebase 存储无法删除具有完整 url 的文件
- pandas - 将时间戳字符串转换为 Timestamp('yyyy-mm-dd H:M:S+0000', tz='UTC')