单核上的多线程有什么意义?

2024-03-21

我最近一直在研究 Linux 内核,并回顾了大学操作系统课程的时代。

就像那时一样,我正在玩线程之类的东西。一直以来我一直假设线程是自动在多个核心上同时运行但我最近发现您实际上必须显式编写代码来处理多个核心。

那么单核上的多线程有什么意义呢?我能想到的唯一例子是在大学编写客户端/服务器程序时,但这似乎是一个弱点。


一直以来我一直假设线程是自动的 在多个核心上同时运行,但我最近发现 您实际上必须显式编写代码来处理多个核心。

对于任何广泛使用的现代操作系统来说,上述内容都是不正确的。例如,所有 Linux 的调度程序都会自动调度不同内核上的线程,甚至在必要时自动将线程从一个内核移动到另一个内核,以最大限度地提高内核利用率。有一些 API 允许您修改调度程序的行为,但这些 API 通常用于disable自动线程到核心调度,而不是启用它。

那么单核上的多线程有什么意义呢?

假设您有一个 GUI 程序,其目的是执行昂贵的计算(例如,渲染 3D 图像或 Mandelbrot 集),然后显示结果。假设这个计算在这个特定的 CPU 上需要 30 秒才能完成。如果您以显而易见的方式实现该程序,并且仅使用单个线程,那么在执行计算时,用户的 GUI 控件将在 30 秒内无响应 - 用户将无法对您的程序执行任何操作,并且可能无法用他的电脑做任何事情。由于用户期望 GUI 控件始终具有响应能力,因此这将是一种糟糕的用户体验。

另一方面,如果您使用两个线程(一个 GUI 线程和一个渲染线程)实现该程序,则用户将能够单击按钮、调整窗口大小、退出程序、选择菜单项等,即使在计算时也是如此正在执行,因为操作系统能够唤醒 GUI 线程并允许其在必要时处理鼠标/键盘事件。

当然,可以使用单线程编写此程序并保持其 GUI 响应能力,方法是编写单线程来执行几毫秒的计算,然后检查是否有可用于处理的 GUI 事件,并处理它们,然后返回进行更多计算,等等。但是,如果您以这种方式编写应用程序,那么您本质上是在应用程序中编写自己的(非常原始的)线程调度程序,那么为什么要重新发明轮子呢?

MacOS 的第一个版本被设计为在单核上运行,但没有真正的多线程概念。这迫使每个应用程序开发人员正确实现一些手动线程管理——即使他们的应用程序没有任何扩展计算,他们也必须明确指示何时使用 CPU,例如通过致电等待下一个事件 http://everything2.com/title/WaitNextEvent。多线程的缺乏使得 MacOS 的早期版本(MacOS-X 之前的版本)在多任务处理方面非常不可靠,因为只要一个编写得不好的应用程序就可能使整个计算机陷入瘫痪。

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

单核上的多线程有什么意义? 的相关文章

  • 其他线程可以修改线程本地内存吗?

    假设我有以下声明 thread local std atomic
  • 我究竟做错了什么? (多线程)

    简而言之 这就是我正在做的事情 在我班级的 cpp 文件中 我有 std vector
  • 是否可以同时读取和写入 java.net.Socket?

    是否可以同时从套接字读取和写入 我有一个连续读取套接字的线程 由于只有一个线程正在从套接字读取数据 因此读取操作是线程安全的 现在我有很多线程 比如100 写入套接字 因此 很明显 我必须通过这样做来使写操作线程安全 package com
  • Java 同步计数器 - get() 怎么样?

    众所周知这么简单x 不是原子操作 实际上是读 增量 写操作 这就是为什么它应该同步 但是关于get 我读过它也应该同步 但有人能解释一下为什么吗 通过引入来避免内存一致性错误happens before关系 当出现以下情况时该怎么办get
  • Pthreads - 高内存使用率

    我正在用 C 编写一些东西 在 256Mb 系统上的 Linux 中创建大量 Pthread 我通常有 200Mb 的免费空间 当我使用少量线程运行该程序时 它可以工作 但是一旦我让它创建大约 100 个线程 它就会出现错误 因为系统内存不
  • ConcurrentHashMap.computeIfAbsent 和 ConcurrentHashMap.computeIfPresent 中 `mappingFunction` 的执行

    我正在尝试查看实际的 Java 文档 描述了多少次的行为mappingFunction可以在传递给时调用ConcurrentHashMap computeIfAbsent and ConcurrentHashMap computeIfPre
  • 何时在多线程中使用 易失性?

    如果有两个线程访问全局变量 那么许多教程都说使该变量成为易失性的 以防止编译器将变量缓存在寄存器中 从而无法正确更新 然而 两个线程都访问共享变量需要通过互斥体进行保护 不是吗 但在这种情况下 在线程锁定和释放互斥体之间 代码位于关键部分
  • Android Thread、AsyncTask 与从 BLE onCharacteristicChanged() 调用的 IntentService

    我有一个 Android 应用程序 我从中接收 BLE 数据 每 62 毫秒通过通知 该应用程序可以通过 BufferedWriter 将数据保存到文件中 在每次 onCharacteristicChanged 回调时 如果用户启用了文件保
  • 发布/订阅架构

    我尝试编写一个发布 订阅系统 客户端和服务器端 其中客户端接收定期更新 如心跳 消息控制 并可以向服务器发出命令 订阅某些源 这样做的好方法是什么 我已经有一个实现线程池的服务器来管理传入的客户端连接 我想知道如何处理连接双方都可以在 Ne
  • 原子变量能保证内存可见性吗?

    关于内存可见性的小问题 代码示例1 class CustomLock private boolean locked false public boolean lock if locked locked true return true re
  • 类和互斥体

    假设我有一个类代表一些名为 foo 的数据结构 class foo public foo attr01 0 void f attr01 5 private int attr01 class fooSingleThreadUserClass
  • RabbitMQ-在一个应用程序进程中为单个队列创建多个消费者是一种好习惯吗

    我刚刚处理一个由 RabbitMQ 支持的新项目 并且在应用程序启动时创建了多个监听同一个队列的消费者实例 然而 它们与不同的渠道共享相同的连接 来自队列的消息非常庞大 一次生成行为有数百万条消息 因此我猜第一个代码作者正在尝试做一些事情来
  • Android SurfaceView 使用线程绘制画布

    我正在尝试使用线程在画布上绘图来创建一个简单的游戏引擎 但我遇到了一些无法解释的奇怪问题 这个 游戏 的目的是每秒在画布上画一个圆圈 这是可行的 但不是我想要的工作方式 似乎应用程序正在两个画布之间切换 并向每个画布添加一个圆圈 这样您就可
  • Shared_ptr 线程安全的开销是多少?

    std shared ptr保证是线程安全的 我不知道典型的实现使用什么机制来确保这一点 但肯定它必须有一些开销 即使您的应用程序是单线程的 这种开销也会存在 是上述情况吗 如果是这样 如果您不使用线程安全保证 这是否意味着它违反了 您不为
  • 线程安全的异步字节队列

    我有一个回调方法 只要有新数据可用 就会调用该方法 public delegate void DataCallback byte buffer int offset int count 我想将其包装在一个实现与此类似的接口的类中 publi
  • 在调用堆栈中看到大量 clr!CLR Semaphore::Wait

    我们看到很多像下面这样的调用堆栈 我可以知道什么条件 情况会发生这种情况吗 OS Thread Id 0x48654 559 Current frame ntdll NtWaitForSingleObject 0xa Child SP Re
  • 将 Python 控制台集成到 GUI C++ 应用程序中

    I m going to add a python console widget into a C GUI below some other controls 许多类将暴露给 python 代码 包括一些对 GUI 的访问 也许我会考虑 P
  • 为什么绿色线程不能在多核上工作

    在维基百科上 绿色线程 http en wikipedia org wiki Green threads被描述为通常无法在多核上运行 而没有解释原因 在多核处理器上 本机线程实现可以 自动将工作分配给多个处理器 而绿色线程 实现通常不能 我
  • 当可能存在迭代器时替换并发集合是否是线程安全的?

    我一直在阅读各种内容 似乎这应该有效 但我想确定一下 我有一个静态属性 它应该是一个缓存 加上一些与缓存数据相关的其他功能 它将实际数据存储在 ConcurrentBag 中 并且有一个 IEnumerable 方法来 过滤并 从此包中生成
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list

随机推荐

  • 信号 11 SIGSEGV 崩溃 Android

    今天我遇到了一个错误 导致我的 Android 应用程序收到 SIGNAL 11 信号 此错误通常是由于 Android 内部存储未经授权的内存区域访问而发生的 一些可能的场景是Web访问 网络通信 服务器图像下载等 我的是浏览器加载 ur
  • AngularJS 选择的空值

    我找不到优雅的设置方式null值与
  • Azure blob 文件下载链接

    我有一个 blob 已存储在 Azure blob 存储中 使用开发模拟器 它全部保存 我可以在 blob 存储的服务器资源管理器中看到它 file mp3 如果重要的话 然后我在我的网站中链接到它 但是当我单击该链接时 我收到了 206
  • 阻止 Laravel 中的路由会话(自定义按需会话处理)

    我正在使用 laravel 为我的 Android 应用程序构建 API 并将默认会话驱动程序设置为 REDIS 我在这里找到一篇好文章http dor ky laravel prevent sessions for routes via
  • 源文件夹不在Java构建类路径上,正在创建Java包

    我试图在排序下创建一个包合并 但它说 源文件夹不在 Java 构建类路径上 So I right click on sort folder and try to add it to the Java build class path But
  • MSN 是 OpenID 提供商吗?

    MSN 是 OpenID 提供商吗 如果是这样 您知道 URL 是什么样的吗 我正在尝试将 MSN 添加到具有用于登录网站的特殊按钮的提供商列表中 Microsoft 有一个附加到 Windows Live ID 的 OpenID 服务目前
  • Firebase 中 IN 关键字的替代是什么?

    我在 Firebase 中的节点为 users uid phone name 我正在寻找IN执行这里 我想检查我的数据库中存在电话号码列表中的哪些条目 然后获取这些条目 在 SQL 数据库中 等效查询可能是 select phone fro
  • 为什么Webpack的DefinePlugin要求我们将所有内容都包装在JSON.stringify中?

    new webpack DefinePlugin PRODUCTION JSON stringify true VERSION JSON stringify 5fa3b9 BROWSER SUPPORTS HTML5 true TWO 1
  • 在 Hive HQL 中将字符串转换为时间戳

    我有一个像 08 03 2018 02 00 00 这样的字符串 我试图将其转换为时间戳值 我正在使用下面的代码 unix timestamp 08 03 2018 02 00 00 yyyy MM dd T HH mm ss SSSXXX
  • 仅更改所选选项的颜色

    我有一个选择器位于表格单元格中 表格行有颜色 因此使用 CSS 我可以将下拉菜单的背景更改为相同的颜色background color inherit 但是 它会更改所有选项的整个框的颜色 是否可以仅更改所选选项的颜色 如果不使用 CSS
  • Elasticsearch 范围查询和范围过滤的区别

    我想查询某个日期范围内的elasticsearch文档 我现在有两个选择 两个都适合我 两个都测试过 1 范围查询 2 范围过滤器 由于我现在的数据集很小 因此我无法测试它们的性能 这两者有什么区别 哪一种会导致更快的文档检索和更快的响应
  • OpenCv:查找多个匹配项

    我有以下内容 但我不知道如何找到源图像中的所有匹配项 static void Main using var template Cv LoadImage images logo png LoadMode GrayScale using var
  • 如何通过Intent接收int

    我通过 Intent 传递一个 int 但我不知道如何接收它 因为我必须从 OnCreate 方法接收一个 Intent 但如果我将它放在那里 我无法将它与代码其余部分中的另一个 int 进行比较 我在这里发送意图 public class
  • NUnit 与 Debug.Assert 冲突

    我正在使用 NUnit 为我的同事编写的库编写单元测试 他的库包含大量在无效输入时触发的 Debug Asserts 当我编写单元测试并向他的库提供无效输入时 他的 Debug Assert 会弹出一个消息框 抱怨输入错误 我觉得他的库对无
  • 从线程返回值

    在 Python 中 如何让线程将元组或我选择的任何值返回给父级 我建议你实例化一个队列 队列 http docs python org library queue html highlight queue Queue Queue在启动线程
  • Android JUnit4 测试

    我想运行一些 JUnit4 测试 该代码依赖于一些Android库 Android XML解析器 但不创建任何activites等 当我尝试运行测试时 我发现找不到我需要的 Android 类 有没有办法使用 Android 代码运行 JU
  • Makefile 在目标体中设置全局变量

    我想通过一个配方设置一个全局变量 然后在另一个配方中引用该变量独立的 recipe 下面的代码是在配方内设置变量的示例代码 但如果在配方外部引用 则变量将保持初始值 ACTIVE a switch ifeq ACTIVE b ACTIVE
  • 使用 NLTK 解析 CoNLL-U 文件

    我知道有CoNLL U https universaldependencies org docs format htmlPython 中的解析器 我只是想得到确认NLTK没有解析 CoNLL U 或具有依赖语法的其他 CoNLL 格式 的本
  • Slack 的 Azure DevOps 扩展是否会受到更改 Azure DevOps URL 的影响?

    在公司 我们将 Azure Devops 工作区的 URL 从https oldname visualstudio com to https dev azure com newname 我们使用两种方法与 Azure DevOps 中的 S
  • 单核上的多线程有什么意义?

    我最近一直在研究 Linux 内核 并回顾了大学操作系统课程的时代 就像那时一样 我正在玩线程之类的东西 一直以来我一直假设线程是自动在多个核心上同时运行但我最近发现您实际上必须显式编写代码来处理多个核心 那么单核上的多线程有什么意义呢 我