多线程:线程多于内核有什么意义?

2024-01-16

我认为多核计算机的要点在于它可以同时运行多个线程。那么,如果你有一台四核机器,那么同时运行超过 4 个线程有什么意义呢?他们不会只是互相窃取时间(CPU 资源)吗?


答案围绕线程的目的,即并行性:同时运行多个单独的执行行。在“理想”系统中,每个核心将执行一个线程:无中断。事实上,情况并非如此。即使您有四个核心和四个工作线程,您的进程和线程也会不断地被切换为其他进程和线程。如果您运行任何现代操作系统,每个进程都至少有一个线程,并且许多进程有更多线程。所有这些进程都同时运行。您的机器上现在可能有数百个线程正在运行。您永远不会遇到线程在没有时间“被窃取”的情况下运行的情况。 (好吧,如果是的话,你可能会实时运行 http://en.wikipedia.org/wiki/Real-time_computing,如果您使用的是实时操作系统,或者甚至在 Windows 上,请使用实时线程优先级。但这种情况很少见。)

以此为背景,答案是:是的,真正的四核机器上超过四个线程可能会给您带来一种“互相窃取时间”的情况,但前提是每个线程都需要 100% CPU。如果一个线程没有 100% 工作(UI 线程可能不会,或者一个线程执行少量工作或等待其他事情),那么正在调度的另一个线程实际上是一个很好的情况。

实际上比这更复杂:

  • 如果您有五项工作需要同时完成怎么办?一次运行所有这些比先运行四个然后再运行第五个更有意义。

  • 线程真正需要 100% CPU 的情况很少见。例如,当它使用磁盘或网络 I/O 时,它可能会花时间等待而不做任何有用的事情。这是一种很常见的情况。

  • 如果您有需要运行的工作,一种常见的机制是使用线程池。拥有与内核相同数量的线程似乎是有意义的,但是.Net 线程池每个处理器最多有 250 个可用线程 http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx。我不确定他们为什么这样做,但我的猜测是与在线程上运行的任务的大小有关。

所以:窃取时间并不是一件坏事(也不是真正的盗窃:这就是系统应该如何工作的方式。)根据线程将执行的工作类型(可能不是 CPU)编写多线程程序-边界。根据分析和测量计算出您需要的线程数。您可能会发现从任务或作业而不是线程的角度思考更有用:编写工作对象并将它们提供给要运行的池。最后,除非您的程序确实对性能至关重要,否则不要太担心:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多线程:线程多于内核有什么意义? 的相关文章

  • Android 中的处理程序到处理程序与 Messenger 到 Messenger 通信

    问题 使用起来是否 更好 更快且开销更少 Handler http developer android com reference android os Handler html与使用 Handler 通信相比信使 http develop
  • BufferBlock 连续

    我想使用以下方式实现消费者 生产者模式BufferBlock
  • 线程安全的有限大小队列,不使用锁

    我正在尝试编写一个主题队列 但遇到死锁和其他多线程问题 我想用Interlocked CompareExchange避免lock用法 但这段代码并没有按预期工作 它只是擦除整个队列 我在这里做错了什么 public class FixedS
  • 将带有 **kwargs 错误的值线程化并传递给 TypeError

    我对 Python 还很陌生 并且正在通过这篇文章研究如何使用线程来处理某些代码 Python 使用线程或队列迭代调用函数的 for 循环 https stackoverflow com questions 12868956 python
  • 多线程 Web 应用程序

    我知道有很多情况都是在应用程序中使用多线程的好例子 但是什么时候最好在 net Web 应用程序中使用多线程 Web 应用程序几乎肯定已经由托管环境 IIS 等 实现多线程化 如果您的页面受 CPU 限制 并且想要使用多个核心 那么可以说多
  • Qt:关闭期间线程仍在运行时 qthread 被销毁

    我有一堂课 class centralDataPool public QObject Q OBJECT public centralDataPool QObject parent 0 centralDataPool commMonitor
  • 初始化 ConcurrentHashMap 值的最快方法

    ConcurrentHashMap 通常在并发环境中用于聚合某个键下的某些事件 例如计算某些字符串值的命中数 如果我们事先不知道密钥 我们需要有一个好的方法来根据需要初始化密钥 它应该在并发性方面快速且安全 这个问题的最佳模式 就效率而言
  • 如何使 ScheduledExecutorService 在计划任务取消时自动终止

    我正在使用一个ScheduledExecutorService如果网络连接已打开超过几个小时 则关闭该连接 然而 在大多数情况下 网络连接在超时之前就关闭了 所以我取消了ScheduledFuture 在这种情况下 我还希望执行程序服务终止
  • 使用 pthread_cond_signal 优雅地终止线程被证明是有问题的

    我需要发射一堆线程 并希望优雅地将它们拉下来 我正在尝试使用pthread cond signal pthread cond wait实现这一目标 但遇到了问题 这是我的代码 首先是thread main static void thrma
  • 如何在Java中执行特定时间段的任务?

    事实上 我会在确定的时间内执行特定的任务 一组指令 例如 我希望我的程序执行任务 5 分钟 如果它得到正确的结果 它会停止 否则它将继续执行正常任务 5 分钟 最后它告诉我 我怎样才能用Java实现这个 你可以像下面这样 import ja
  • UI 线程正在阻塞调用 COM 对象的后台线程

    我正在开发一个通过第三方 COM 库与外部设备通信的应用程序 我试图让与设备的所有通信都通过后台线程 以防止通信问题搞砸我的应用程序 并消除在 UI 线程中进行通信所引入的一些其他复杂性 问题是 每当发生导致主 UI 线程阻塞的情况 即调用
  • C# 线程和队列

    这不是关于我可以或应该使用的不同方法来以最佳方式利用队列 而是关于我所看到的对我来说毫无意义的事情 void Runner member variable queue Queue Synchronized new Queue while t
  • 使用 volatile bool 强制另一个线程等待是否安全? (C++)

    我读到的有关 volatile 的所有内容都说它永远不安全 但我仍然倾向于尝试它 而且我还没有看到这种特定场景被宣布为不安全 我有一个单独的线程来渲染场景 从主模拟线程中提取数据 这没有同步 并且工作正常 问题是 当程序退出时 渲染器需要停
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 未定义的命名空间“提升”

    我正在尝试一个 C 小线程程序 但出现错误 我无法处理它 The Code include Threads h include Interthread h void task1 void arg do stuff void task2 do
  • C#中如何获取正在运行的线程列表?

    我在 C 中创建动态线程 并且需要获取这些正在运行的线程的状态 List
  • PHP 多个 Ajax 请求:第一个请求阻止第二个请求

    我在一页上有 2 个 ajax 请求 我运行了第一个请求并单独启动了第二个请求 但第二个在第一个运行后停止工作 第一次结束后继续 第一个请求需要很长时间 大约 30 60 秒 此时我需要第二个请求来显示日志第一个请求发生的情况 我尝试使用
  • Perl 中的线程定时循环

    本质上 我希望有一个高优先级线程 它以给定的时间间隔 此处为 0 5 毫秒 运行并中断 一切 执行一个短任务 然后返回 睡眠 状态 使用 Ubuntu 11 04 和 perl v5 10 1 问题是 虽然我得到了某种结果 但我不确定是否有
  • 如果两个线程同时访问同一个 bool 变量会发生什么?

    我有一个跨平台 C 程序 其中使用 boost 库创建异步计时器 我有一个全局变量 bool receivedInput false 一个线程等待并处理输入 string argStr while 1 getline cin argStr
  • boost::asio::io_service 是否保留处理程序的顺序?

    Does boost asio io service http www boost org doc libs release doc html boost asio reference io service html保证处理程序的调用顺序与

随机推荐

  • Gradle从哪个版本开始支持Java 17

    当尝试配置项目时 我收到错误 不支持 Java 您的构建当前配置为使用 Java 17 0 1 和 Gradle 7 0 不幸的是 没有信息官方文档 https docs gradle org current userguide compa
  • CAtlList::RemoveAt 是否会使现有的 POSITIONS 无效?

    我正在看这个 其中 m Rows 是 CAtlList void CData RemoveAll size t cItems m Rows GetCount POSITION Pos m Rows GetHeadPosition while
  • 如何按特定顺序自动启动程序?

    我的 i3 配置文件中有以下几行 Startup applications exec firefox exec gnome terminal exec nautilus 这些行按预期启动 firefox gnome terminal 和 n
  • Erlang 和带有西里尔字母的二进制

    我需要能够使用其中包含西里尔字符的二进制文件 我尝试只写 lt lt gt gt 但我收到了 badarg 错误 如何在 Erlang 中使用西里尔字母 或 unicode 字符串 如果你想输入上面的表达式erlang shell 请阅读u
  • 使用基于单选按钮值的 javascript(Node JS) 将数据插入 mysql(Sequelize)

    我有下面的 json 对象 phoneno field1 Mohamed field2 123456789 field3 Sameer field1 Ganesh field2 987654321 field3 Pandiyan sende
  • “现代”正则表达式的识别能力

    真正的现代正则表达式实际上可以识别哪一类语言 每当存在带有反向引用的无限长度捕获组时 例如 1 正则表达式现在匹配非常规语言 但这本身并不足以匹配类似的东西S S 匹配括号对的上下文无关语言 递归正则表达式 这对我来说是新的 但我确信 Pe
  • 如何为 NDK 工具链的 gcc 包含

    首先 我上次尝试将c程序编译到linux arm架构时遇到了一个问题 以便稍后在android应用程序中使用它 我成功地做到了这一点 稍后我将写一篇关于如何使用 NDK 独立工具链的文章 现在我终于开始工作了 我正在尝试编译一个 c 文件
  • 画半条无限直线?

    我使用 pyqtgraph 进行数据采集 并且必须在图形视图上表示一些阈值 例如表示高电压限制等 我使用了该类InfiniteLine来自 pyqtgraph 但现在 我必须考虑在采集过程中阈值可能发生的一些变化 它看起来像是两条无限线之间
  • 为什么 Dapper dot net 不自行打开和关闭连接?

    Dapper 隐式地期望连接在使用时打开 为什么它不自己打开和关闭 这不是简单的连接管理吗 我问这个问题是因为我和一位同事一直在反复探讨连接池幕后发生的事情的本质 以及在多个命令中保持连接打开或打开和关闭连接是否有任何好处对于每个命令 Da
  • python中zip档案的流式解压

    有没有办法对单文件 zip 档案进行流式解压缩 我目前在 s3 中有任意大的压缩存档 每个存档一个文件 我希望能够通过迭代来处理文件 而不必实际将文件下载到磁盘或内存中 一个简单的例子 import boto def count newli
  • 在android程序中下载gmail附件

    我尝试了很多搜索 最后在这里问 我需要写一段代码下载附件形成我的GMail 我怎样才能做到这一点 到目前为止 我可以阅读 发送电子邮件 但仍在弄清楚如何下载附件 任何帮助将不胜感激 附件不单独下载 它们是 MIME 多部分文档的一部分 您可
  • 使用 HTTParty 捕获特定请求

    我想在不使用代理的情况下捕获给定操作的完整请求 raw request 通过网络传输的内容 我知道类上的 debug output 方法 这可能是解决方案的一部分 但不清楚如何根据每个请求进行设置 考虑以下 response HTTPart
  • 黑莓中的正则表达式?

    如何在 Blackberry 中使用正则表达式验证电子邮件 Blackberry API 中没有 Pattern 类 有没有其他方法可以验证 谢谢 当前的 Blackberry API 中没有正则表达式 尝试这个 http code goo
  • 具有可变参数的回调函数 tkinter 按钮[重复]

    这个问题在这里已经有答案了 from tkinter import F Tk i 1 while i lt 10 newButton Button F text Show Number command lambda showNumber i
  • Python:Ramer-Douglas-Peucker(RDP)算法,用点数代替 epsilon

    我想修改以下 python 脚本RDP算法 https en wikipedia org wiki Ramer E2 80 93Douglas E2 80 93Peucker algorithm目的是不使用 epsilon 而是选择我想在决
  • 方案没有文件系统:cos

    我正在尝试从 IBM Data Science Experience 连接到 IBM Cloud Object Storage access key XXX secret key XXX bucket mybucket host lon i
  • 如何在 Azure 逻辑应用程序中使用 OAuth 2.0 身份验证?

    我正在尝试创建一个带有 FTP 触发器的简单逻辑应用程序 然后将任何上传的文件内容通过管道传输到我在 Azure 中托管并使用 OAuth 2 0 客户端凭据授予流进行保护的 Web API 如何在逻辑应用中配置 OAuth 2 0 身份验
  • 在 NestJS 微服务中公开正常的 http 端点

    我用 NestJs 编写了这个微服务 async function bootstrap const port parseInt process env PORT 5000 10 const app await NestFactory cre
  • 为什么一种形式的最后一个元素与第二种形式的第一个元素之间存在间隙?

    我有这个 html 文件 margin 0 padding 0 box sizing border box body margin 0 background ff5 form display inline nick msg backgrou
  • 多线程:线程多于内核有什么意义?

    我认为多核计算机的要点在于它可以同时运行多个线程 那么 如果你有一台四核机器 那么同时运行超过 4 个线程有什么意义呢 他们不会只是互相窃取时间 CPU 资源 吗 答案围绕线程的目的 即并行性 同时运行多个单独的执行行 在 理想 系统中 每