线程的单独堆栈空间的重要性
The significance of separate stack-space for 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
是局部堆栈变量,但大部分时间都在后台线程中度过。 这安全吗??后台线程究竟如何能够访问此线程的堆栈变量?
一般来说,堆栈和堆是可以在线程之间共享的内存空间的一部分。没有人阻止您共享堆栈寻址变量。
然而,每个线程都有自己的一组寄存器,包括一个堆栈指针(和衍生物),因此如果需要,您可以维护单独的堆栈(否则是不可能的),因此线程可以调用函数并执行所需的任何操作。如果需要,您可以选择打破这种分离。
我认为这里的混淆在于您将线程的堆栈视为只能由一个线程访问的单独实体。这不是这样工作的。
每个进程都有一个大的内存空间供其使用,每个线程都可以读取(和写入!)此空间中的所有内容;分离为堆栈空间和堆是更高级别的设计决策。对于后台线程,它接收的内存是在另一个线程的堆栈上还是在堆上分配并不重要。
甚至在极少数情况下,您想自己为线程创建一个新堆栈 - 对线程本身没有影响。
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- OpenGL相机和相机空间转型的困惑
- CUDA内核和数学函数的显式命名空间
- 打印第二列时的2d字符矢量打印空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 为什么 openmp 的并行不适用于矢量化色彩空间转换?
- 是否可以将函数导入命名空间,但不能导出它?
- 线程的单独堆栈空间的重要性