所以我在读这个问题:
https://stackoverflow.com/questions/1762418/what-resources-are-shared-between-threads
并基于答案,“线程共享除堆栈之外的所有段,但一个线程仍然可以访问另一个线程的堆栈”??
但我还有三个问题:
一个进程的所有线程都在同一个虚拟内存空间中工作吗?
当我们说线程仍然可以访问其他线程的堆栈时,这是否意味着例如,如果我们的堆栈从 0x00 到 0xff,那么一个线程可能从 0x00 到 0x0f 工作,而另一个线程从 0x10 到 0xff 工作?或者 ..?
堆栈是Linux中每个线程唯一的虚拟内存中唯一的部分吗?
是的。每个线程都有自己的堆栈,但与进程关联的所有内存都在同一个虚拟地址空间中。如果一个线程中的函数具有指向另一个线程中堆栈分配变量的指针,则该函数可以读取/写入该变量。
就像我在回答您的第一个问题时所说的那样,每个线程都有自己的堆栈。抽象地说,这意味着一个线程的堆栈从 A 运行到 B,而另一个线程的堆栈从 C 运行到 D,其中 A < B < C < D(即 AB 范围与 CD 范围不重叠) .
堆栈的唯一性与虚拟内存无关。堆栈(实际上是“激活记录堆栈”)用于存储有关正在运行的函数(包括当前正在运行的函数和所有调用函数)的信息。如果有多个线程,那么就有多个函数(和调用函数)。如果线程要共享一个激活记录交错的堆栈,则几乎不可能知道函数完成时返回哪个调用函数。