线程单独堆栈空间的意义

时间:2014-02-20 20:42:30

标签: c++ multithreading

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

但我最近发现一些代码让我对这究竟是什么意思产生了疑问 以下是代码的缩写版本:

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

2 个答案:

答案 0 :(得分:1)

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

然而,每个线程都有自己的寄存器集,包括堆栈指针(及其衍生物),因此如果需要,可以维护单独的堆栈(否则就不可能),所以线程可以调用函数并做任何他们需要的事情。如果需要,您可以选择打破这种分离。

答案 1 :(得分:1)

我认为这里的混淆是你认为一个线程的堆栈是一个单独的实体,只能由一个线程访问。这不是它的工作原理。

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

甚至很少有你想自己为线程创建一个新堆栈的情况 - 对线程本身没有任何影响。