线程的单独堆栈空间的重要性

The significance of separate stack-space for threads

本文关键字:重要性 空间 单独 线程 堆栈      更新时间:2023-10-16

我早就知道每个线程都有单独的堆栈空间,但共享堆内存。

但是我最近发现了一些代码,让我质疑这到底意味着什么。
以下是代码的缩短版本:

void SampleFunction()
{
    CRemoteMessage rmessage;
    rMessage.StartBackgroundAsync();   // Kickoff a background thread.
    /* Do other long-running work here... 
     * but don't leave function SampleFunction
     */
    rMessage.GetReply();   // Blocks if needed, but the message-background is mostly done by now.
    rMessage.ProcessReply();
}

在此代码中,rmessage是局部堆栈变量,但大部分时间都在后台线程中度过。 这安全吗??后台线程究竟如何能够访问此线程的堆栈变量?

一般来说,堆栈和堆是可以在线程之间共享的内存空间的一部分。没有人阻止您共享堆栈寻址变量。

然而,每个线程都有自己的一组寄存器,包括一个堆栈指针(和衍生物),因此如果需要,您可以维护单独的堆栈(否则是不可能的),因此线程可以调用函数并执行所需的任何操作。如果需要,您可以选择打破这种分离。

我认为这里的混淆在于您将线程的堆栈视为只能由一个线程访问的单独实体。这不是这样工作的。

每个

进程都有一个大的内存空间供其使用,每个线程都可以读取(和写入!)此空间中的所有内容;分离为堆栈空间和堆是更高级别的设计决策。对于后台线程,它接收的内存是在另一个线程的堆栈上还是在堆上分配并不重要。

甚至在极少数情况下,您想自己为线程创建一个新堆栈 - 对线程本身没有影响。