C++ 线程独立堆栈空间的意义

C++ 线程独立堆栈空间的意义,c++,multithreading,C++,Multithreading,我早就知道每个线程都有单独的堆栈空间,但共享堆内存 但我最近发现了一些代码,让我质疑这到底意味着什么。 以下是代码的简化版本: void SampleFunction() { CRemoteMessage rmessage; rMessage.StartBackgroundAsync(); // Kickoff a background thread. /* Do other long-running work here... * but don't l

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

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

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
是一个本地堆栈变量,但它的大部分时间都花在后台线程中。这安全吗??后台线程究竟如何访问该线程的堆栈变量

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


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

我认为这里的混乱之处在于,您认为线程堆栈是一个单独的实体,只能由一个线程访问。这不是怎么回事

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


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

您说的“如何”是什么意思?你的CPU执行内存读取,这就是为什么…它是安全的。该类使用this指针访问堆栈框架上的对象。在同一进程中,所有线程的地址空间都不同?@Chuanhang。线程没有地址空间,进程有地址空间,所有线程共享相同的地址空间。