我一直试图找到一个好的定义,并理解线程到底是什么。

似乎我一定遗漏了一些明显的东西,但每次我读到什么是线程,它几乎是一个循环的定义,比如“线程是执行的线程”或“一种划分运行任务的方法”。嗯嗯。嗯?

It seems from what I have read that a thread is not really something concrete, like a process is. It is in fact just a concept. From what I understand of the way this works, a processor executes some commands for a program (which has been termed a thread of execution), then when it needs to switch to processing for some other program for a bit, it stores the state of the program it's currently executing for somewhere (Thread Local Storage) and then starts executing the other program's instructions. And back and forth. Such that, a thread is really just a concept for "one of the paths of execution" of a program that is currently running.

不像一个过程,它是一个资源的集合,等等。

作为一个定义的例子,它并没有真正帮助到我…

从维基百科:

“在计算机科学中,线程是执行线程的缩写。线程是程序将自身分割(称为“分裂”)为两个或多个同时(或伪同时)运行的任务的一种方法。不同操作系统的线程和进程各不相同,但一般来说,线程包含在进程中,同一进程中的不同线程共享相同的资源,而同一多任务操作系统中的不同进程则不相同。”

我说的对吗?错了吗?线程到底是什么?

编辑:显然,线程也有自己的调用堆栈,所以这是一个具体的东西。


当前回答

线程是处理器寄存器(对于单核)的一组独立值。因为这包括指令指针(又名程序计数器),它控制执行的顺序。它还包括堆栈指针,它最好为每个线程指向一个唯一的内存区域,否则它们会相互干扰。

线程是受控制流(函数调用、循环、goto)影响的软件单元,因为这些指令操作在指令指针上,而指令指针属于特定的线程。线程通常根据一些优先级方案进行调度(尽管可以设计一个系统,每个处理器核心有一个线程,在这种情况下,每个线程总是在运行,不需要调度)。

事实上,该指令指针的值和存储在该位置的指令足以确定该指令指针的新值。对于大多数指令来说,这只是按照指令的大小将IP向前推进,但是控制流指令以其他可预测的方式改变IP。IP值的序列形成了在程序代码中编织的执行路径,从而产生了“线程”的名称。

其他回答

不幸的是,线程确实存在。线是有形的东西。就算你杀了一个,其他的人还是会逃。您可以生成新的线程....虽然每个线程不是它自己的进程,但它们在进程中单独运行。在多核机器上,两个线程可以同时运行。

http://en.wikipedia.org/wiki/Simultaneous_multithreading

http://www.intel.com/intelpress/samples/mcp_samplech01.pdf

答案在不同的系统和不同的实现中有很大的不同,但最重要的部分是:

一个线程有一个独立的执行线程(也就是说,你可以从它的上下文切换,然后返回,它将继续运行在它原来的地方)。 一个线程有一个生命周期(它可以由另一个线程创建,另一个线程可以等待它完成)。 它可能比“过程”附带的包袱更少。

除此之外:线程可以由语言运行时在单个进程中实现,线程可以是协程,线程可以由线程库在单个进程中实现,或者线程可以是内核构造。

在一些现代Unix系统中,包括我最熟悉的Linux,一切都是线程——一个进程只是一种线程类型,它与其父线程共享相对较少的东西(例如,它有自己的内存映射,自己的文件表和权限等)。

为了正式地定义线程,我们必须首先了解线程操作的边界。

当计算机程序从某个存储器载入计算机内存并开始执行时,它就成为一个进程。一个进程可以由一个处理器或一组处理器执行。内存中的进程描述包含重要信息,如程序计数器,它跟踪程序中的当前位置(即当前正在执行的指令),寄存器,变量存储,文件句柄,信号,等等。

线程是程序中这样的指令序列,可以独立于其他代码执行。如图所示为概念:

线程位于相同的进程地址空间中,因此,进程内存描述中的大部分信息可以跨线程共享。

有些信息不能复制,比如堆栈(每个线程指向不同内存区域的堆栈指针)、寄存器和特定于线程的数据。这些信息足以允许线程独立于程序的主线程和程序中的一个或多个其他线程进行调度。

运行多线程程序需要明确的操作系统支持。幸运的是,大多数现代操作系统都支持线程,如Linux(通过NPTL)、BSD变体、Mac OS X、Windows、Solaris、AIX、HP-UX等。操作系统可以使用不同的机制来实现多线程支持。

在这里,你可以找到关于这个主题的更多信息。这也是我的信息来源。

让我补充一句来自Edward Lee和Seshia的《嵌入式系统导论》:

Threads are imperative programs that run concurrently and share a memory space. They can access each others’ variables. Many practitioners in the field use the term “threads” more narrowly to refer to particular ways of constructing programs that share memory, [others] to broadly refer to any mechanism where imperative programs run concurrently and share memory. In this broad sense, threads exist in the form of interrupts on almost all microprocessors, even without any operating system at all (bare iron).

线程是处理器寄存器(对于单核)的一组独立值。因为这包括指令指针(又名程序计数器),它控制执行的顺序。它还包括堆栈指针,它最好为每个线程指向一个唯一的内存区域,否则它们会相互干扰。

线程是受控制流(函数调用、循环、goto)影响的软件单元,因为这些指令操作在指令指针上,而指令指针属于特定的线程。线程通常根据一些优先级方案进行调度(尽管可以设计一个系统,每个处理器核心有一个线程,在这种情况下,每个线程总是在运行,不需要调度)。

事实上,该指令指针的值和存储在该位置的指令足以确定该指令指针的新值。对于大多数指令来说,这只是按照指令的大小将IP向前推进,但是控制流指令以其他可预测的方式改变IP。IP值的序列形成了在程序代码中编织的执行路径,从而产生了“线程”的名称。

流程就像使用两台不同计算机的两个人,他们在必要时使用网络共享数据。线程就像使用同一台计算机的两个人,他们不必显式地共享数据,但必须小心地轮流使用。

从概念上讲,线程只是在同一个地址空间中忙碌的多个工蜂。每个线程都有自己的堆栈、程序计数器等等,但是一个进程中的所有线程都共享相同的内存。假设两个程序同时运行,但它们都可以访问相同的对象。

将此与流程进行对比。每个进程都有自己的地址空间,这意味着一个进程中的指针不能用于引用另一个进程中的对象(除非使用共享内存)。

我想需要理解的关键是:

进程和线程可以“同时运行”。 进程不共享内存(默认情况下),但是线程与同一进程中的其他线程共享它们的所有内存。 进程中的每个线程都有自己的堆栈和指令指针。