首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对单线程编程和多线程编程区别的误解

对单线程编程和多线程编程区别的误解
EN

Stack Overflow用户
提问于 2012-04-11 17:07:27
回答 6查看 55K关注 0票数 38

我对单线程编程和多线程编程之间的区别有一个误解,所以我希望下面的问题有一个答案来说明一切。

假设有9个独立的任务,我想用一个单线程程序和一个多线程程序来完成它们。基本上是这样的:

Single-thread:

代码语言:javascript
运行
复制
- Execute task 1
- Execute task 2
- Execute task 3
- Execute task 4
- Execute task 5
- Execute task 6
- Execute task 7
- Execute task 8
- Execute task 9

Multi-threaded:

Thread1:

代码语言:javascript
运行
复制
- Execute task 1
- Execute task 2
- Execute task 3

Thread2:

代码语言:javascript
运行
复制
- Execute task 4
- Execute task 5
- Execute task 6

Thread3:

代码语言:javascript
运行
复制
- Execute task 7
- Execute task 8
- Execute task 9

据我所知,一次只执行一个线程(获取CPU),一旦量程完成,线程调度程序将把CPU时间分配给另一个线程。

那么,哪个程序会提前完成呢?是多线程程序(逻辑上的)吗?或者是单线程程序(因为多线程有大量的上下文切换,这需要一些时间)?为什么?我需要一个很好的解释:)

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-04-11 17:10:02

那得看情况。

你有多少个CPU?在你的任务中涉及多少I/O?

  1. 如果您只有一个CPU,并且任务没有阻塞I/O,那么单线程完成的速度将等于或快于多线程,因为切换线程是有开销的。
  2. 如果您有一个CPU,但是任务涉及很多阻塞I/O,您可能会通过使用线程看到一个加速,假设工作可以在I/O进行时完成。
  3. 如果您有多个cpus,那么您应该会看到多线程实现在单线程上的加速,因为超过一个线程可以并行执行。当然,除非任务以I/O为主,否则限制因素是设备速度,而不是CPU功率。
票数 38
EN

Stack Overflow用户

发布于 2012-04-11 17:10:32

据我所知,一次只执行一个线程。

如果CPU只有一个内核,情况就会如此。现代CPU有多个核心,可以并行运行多个线程。

运行三个线程的程序运行速度将快近三倍。即使任务是独立的,计算机中仍有一些资源必须在线程之间共享,比如内存访问。

票数 11
EN

Stack Overflow用户

发布于 2012-04-11 17:28:42

假设集:没有超线程的单核任务;任务是CPU约束的;每个任务需要3量子时间;每个调度器分配的时间限制为1量子;FIFO调度器不可抢占;所有线程同时命中调度器;所有上下文切换都需要相同的时间。

程序的划分如下:

  • 测试1:单进程,单线程(包含所有9个任务)
  • 测试2:单个进程,三个线程(每个包含3个任务)
  • 测试3:三个进程,每个线程(每个包含3个任务)
  • 测试4:三个进程,每个进程有三个线程(每个包含一个任务)

在上述假设下,它们都同时完成。这是因为CPU调度的时间是相同的,上下文开关是相同的,没有中断处理,也没有等待IO的东西。

要更深入地了解这一点,请查找这本书

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10110660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档