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

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(使用前将#替换为@)

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

  • 多线程应用程序断点

    如果我对多线程应用程序设置断点 会发生什么情况 它是否停止所有线程 仅停止断点的线程 还是整个程序崩溃 如果可能的话 我是否只想停止一个线程 或者这会弄乱我的应用程序 如果我无法对多线程应用程序进行断点 我可以使用哪些调试技术 JAVA 就
  • 从新线程更新 JProgressBar

    如何从另一个线程更新 JProgressBar setValue int 我的第二个目标是用尽可能少的课程来完成它 这是我现在的代码 Part of the main class pp addActionListener new Actio
  • 为什么 java 中 wait/notify/notifyAll 方法不同步?

    在Java中 每当我们需要调用wait notify notifyAll时 我们都需要访问对象监视器 通过synchronized方法或通过synchronized块 所以我的问题是为什么java不采用同步等待 通知方法来消除从同步块或方法
  • Android中线程加载的Web图像

    我在 ListActivity 中有一个扩展的 BaseAdapter private static class RequestAdapter extends BaseAdapter 以及其中定义的一些处理程序和可运行对象 Need han
  • 如何在 Scrapy/Twisted 中使用线程,即如何在响应回调中对阻塞代码进行异步调用?

    我需要在Scrapy中运行一些多线程 多处理工作 因为我有一些使用阻塞调用的库 并在完成后将请求放回Scrapy引擎 我需要这样的东西 def blocking call self html do some work in blocking
  • 使用 ManagementObjectSearcher 时检测到 DisconnectedContext

    我在 WndProc 覆盖中使用以下函数 Public Function GetPortName As String Dim portNameData As String Dim comPortNumber As String Try Di
  • 并行处理的ThreadPool和Pool

    有没有办法在 python 中同时使用 ThreadPool 和 Pool 来通过指定您希望使用的 CPU 和内核的数量来并行循环 例如 我将循环执行为 from multiprocessing dummy import Pool as T
  • C++ 条件变量通知未按预期工作

    我正在尝试在之前的工作完成后立即启动新线程worker thread has started 但也许结束了 也可能没有结束 我已经用时间延迟替换了开始和结束的工作 我的代码是 include
  • “yield”不是“std::this_thread”的成员

    我试图产生当前线程 std this thread yield 但不幸的是 海湾合作委员会更清楚 yield 不是 std this thread 的成员 我是否忘记了一些类似于 D GLIBCXX USE NANOSLEEP 的 hack
  • 增加 C++ 程序 CPU 使用率

    我有一个用 C 编写的程序 每秒运行多个 for 循环 而不使用任何会使其因任何原因等待的东西 它始终使用 2 10 的 CPU 有没有什么方法可以强制它使用更多的CPU并进行更多的计算而不使程序变得更复杂 此外 我在 Windows 计算
  • 将阻塞调用包装为异步,以实现更好的线程重用和响应式 UI

    我有一个类负责通过调用遗留类来检索产品可用性 该遗留类本身通过进行 BLOCKING 网络调用在内部收集产品数据 请注意 我无法修改旧版 API 的代码 由于所有产品都是相互独立的 因此我希望并行收集信息 而不会创建任何不必要的线程 也不会
  • 我是否需要在编译时添加 _REENTRANT 宏以使我的 errno 线程安全?

    我是否需要在编译时添加 REENTRANT 宏以使我的 errno 线程安全 如果不是 是所有版本的 gcc linux solaris 都是这样还是某些旧版本需要 我最近测试了一段未使用 REENTRANT 的代码 发现 errno 在多
  • TestNG 与 DataProvider 并行执行

    我有一个从数据提供者接收数据的测试 我希望此测试与数据提供者的不同值并行运行 我尝试了这样的方法 public class IndependentTest Test dataProvider dp1 threadPoolSize 3 inv
  • Azure ServiceBus 和异步 - 是还是不是?

    我正在 Azure 上运行服务总线 泵送每秒 10 100 条消息 最近我已经切换到 net 4 5所有人都兴奋地重构了所有代码 异步 和 等待 每行至少两次 以确保它 正确 完成 现在我想知道这是否真的是为了是好是坏 如果您可以查看代码片
  • Play 框架:当请求超出可用线程时会发生什么

    我的线程池中有一个线程服务阻塞请求 def sync Action import Contexts blockingPool Future Thread sleep 100 Ok Done 在 Contexts blockingPool 中
  • 何时使用 BlockingCollection 以及何时使用 ConcurrentBag 而不是 List

    The 为什么这个 Parallel ForEach 代码会冻结程序 问题的接受答案 https stackoverflow com a 8365614 2031316建议将列表用法替换为并发包 http msdn microsoft co
  • Java中如何让另一个线程休眠

    我有一个扩展 Thread 的类 这个线程在运行时大部分时间都在睡眠 它会执行一个检查 如果 true 执行一个简单的操作 然后睡眠 1 2 秒并重复 该类还有一个由其他线程调用的公共方法 如果调用此函数 我希望线程在已经休眠的情况下休眠更
  • 大师系统要求

    我们将使用 Virtuoso 来存储 RDF 三重计数一开始将为 1 亿 我需要知道典型的 RAM CPU 磁盘等应该是什么 查询将使用 SPARQL 并且查询会有点复杂 请提供您的意见 Virtuoso 版本 6 x 三元组 四元组 的平
  • 并发 log4j

    我有自己的日志引擎 它将日志写入带有阻塞队列的单独线程上 为了使用 标准软件 我正在考虑切换到 log4j 我不希望我的高并发软件因日志命令而变慢 这些日志命令在调用命令时将所有内容写入磁盘 log4j 可以用作垃圾箱吗 Log4j 是大多
  • pthread_join() 中的阻塞

    根据手册页 pthread join 函数应暂停调用的执行 线程直到目标线程终止 除非目标线程 已经终止了 因此 据我了解 调用进程将阻塞 直到指定的线程退出 现在考虑以下代码 pthread t thrs NUMTHREADS for i

随机推荐

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