multithreading - 单核没有多线程优势
问题描述
我是并发编程和多线程的新手。我可以理解多核处理器的多线程的好处,但这些好处是否存在于单核处理器上,
例如,假设我们有一台多核计算机和一个程序来总结一个非常大的数字:
int sum = 0;
for (i=1, i<9999999999, i++)
{
sum += i;
}
doOtherStuff(); // execute other function that is irrelevant to sum
...
...
//and then finally print the sum
Console.WriteLine(sum);
所以对于长时间运行的求和任务,我们可以创建第二个线程来计算和,主线程继续执行其他函数。
但是如果我们在单核计算机上运行这个程序,创建多线程并没有什么好处,不是吗?由于上下文切换,多线程会更糟吗?
解决方案
多线程有两个主要好处。
它允许非顺序计算同时发生,从而提高执行速度。
它还允许程序在等待阻塞操作时不会停止。
在您的示例中,执行速度没有增加,因为处理器仍必须在一个内核中执行每个命令。但是,如果您在循环期间等待用户输入(或执行另一个阻塞应用程序),那么如果 doOtherStuff() 在同一个线程中,您将无法完成它。通过将 doOtherStuff() 及其阻塞操作保留在单独的线程中,您将不会阻止求和操作的执行。
为了让多个应用程序使用单个核心处理器运行,操作系统使用循环执行。它从一个线程/应用程序移动到另一个线程/应用程序,一次执行几行。通过将阻塞情况分成不同的线程,您可以利用这一点。这通常通过 i/o 操作完成。
现在,“情况更糟吗?”
如果您受内存限制,则可能会出现问题,因为每个线程都有自己的堆栈。但是,由于操作系统已经在各种应用程序和操作之间切换上下文,因此通过添加循环对执行时间的不利影响可能很小。
推荐阅读
- flutter - 颤动,为什么不渲染 ListView
何时调用构建方法? - python - python regex - 用原始字符串转义
- mongodb - 在 Mongo 中禁用而不删除数据库或集合
- c# - 使用 c# 将委托传递给非托管代码中的回调函数
- python - Random image selector with Wagtail and Django
- python - Python:构建具有多个响应的字典(嵌套字典?)
- html - 无法在移动设备上删除标题图像周围的灰色空间?
- weblogic - 问题:这个Oracle软件在安装weblogic时没有在当前操作系统上认证
- cuda - 在 CUDA 中查找线程索引和块索引
- java - 如何在跨越两个网格的按钮的一个网格中居中文本?