我早就知道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
是一个本地堆栈变量,但大部分时间都花在后台线程中。这样安全吗?后台线程究竟能够访问此线程的堆栈变量?
答案 0 :(得分:1)
一般来说,堆栈和堆是可以在线程之间共享的内存空间的一部分。没有人阻止你共享堆栈寻址变量。
然而,每个线程都有自己的寄存器集,包括堆栈指针(及其衍生物),因此如果需要,可以维护单独的堆栈(否则就不可能),所以线程可以调用函数并做任何他们需要的事情。如果需要,您可以选择打破这种分离。
答案 1 :(得分:1)
我认为这里的混淆是你认为一个线程的堆栈是一个单独的实体,只能由一个线程访问。这不是它的工作原理。
每个进程都有一个大的内存空间供其使用,每个线程都可以在此空间中读取(并写入!)所有;分离到堆栈空间和堆是一个更高层次的设计决策。对于后台线程,它接收的内存是在另一个线程的堆栈上还是在堆上分配并不重要。
甚至很少有你想自己为线程创建一个新堆栈的情况 - 对线程本身没有任何影响。