误解了单线程和多线程编程之间的区别

时间:2012-04-11 17:07:27

标签: multithreading language-agnostic

我对单线程和多线程编程之间的区别存在误解,因此我想要回答以下问题以使一切清楚。

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

单螺纹:

- 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

多线程:

线程1:

- Execute task 1
- Execute task 2
- Execute task 3

线程2:

- Execute task 4
- Execute task 5
- Execute task 6

Thread3:

- Execute task 7
- Execute task 8
- Execute task 9

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

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

6 个答案:

答案 0 :(得分:24)

取决于。

你有多少cpus?您的任务涉及多少I / O?

如果你只有1个cpu,并且任务没有阻塞I / O,那么单线程将完成等于或快于多线程,因为切换线程有开销。

如果你有1个cpu,但这些任务涉及大量阻塞I / O,你可能会看到使用线程加速,假设在I / O正在进行时可以完成工作。

如果你有多个cpus,那么你应该看到单线程上多线程实现的加速,因为多个线程可以并行执行。当然,除非I / O主导任务,否则限制因素是您的设备速度,而不是CPU功率。

答案 1 :(得分:8)

  

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

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

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

答案 2 :(得分:2)

嗯,这不完全是语言不可知的。一些解释的编程语言不支持真正的线程。也就是说,执行的线程可以由程序定义,但解释器是单线程的,因此所有执行都在CPU的一个核心上。

对于支持真正多线程的编译语言和语言,单个CPU可以拥有多个内核。实际上,大多数台式计算机现在有2或4个核心。因此,执行真正独立任务的多线程程序可以根据CPU中可用内核的数量加快2-4倍。

答案 3 :(得分:2)

假设集: 没有超线程的单核; 任务是CPU绑定的; 每项任务需要3个量子的时间; 每个调度程序分配限制为1个量子的时间; FIFO调度器Nonpreemptive; 所有线程同时命中调度程序; 所有上下文切换都需要相同的时间;

流程描述如下:

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

根据上述假设,他们都在同一时间完成。这是因为为CPU安排了一定数量的时间,上下文切换是相同的,没有中断处理,没有任何东西在等待IO。

有关此问题的更深入内容,请查看this book

答案 4 :(得分:0)

Java中单线程和多线程之间的主要区别在于,单线程执行进程的任务,而在多线程中,多线程执行进程的任务。

进程是正在执行的程序。流程创建是一项资源消耗任务。因此,可以将一个进程分为多个称为线程的单元。线程是轻量级进程。可以将单个进程划分为多个线程并为其分配任务。当一个进程中只有一个线程时,它称为单线程应用程序。当一个进程中有多个线程时,它称为多线程应用程序。

答案 5 :(得分:-1)

ruby​​ vs python vs nodejs:Web应用程序中的性能,这需要大量I / O,nonblockingrest / dbQuery会对此产生很大影响。作为所有3个线程中唯一的多线程,nodejs是领先者差距较大的赢家