c++ - 内存中的静态和全局变量

标签 c++ c multithreading multiprocessing

  1. 存储在堆栈上的静态变量本身是否类似于全局变量?如果是这样,如何保护它们以仅允许本地类访问?

  2. 在多线程上下文中,是否担心此内存可以被其他线程/内核直接访问?或者为什么我们不能在多进程/线程环境中使用静态/全局?

最佳答案

存储在堆栈中的变量本质上是暂时的。它们属于一个函数等,当函数返回并且弹出相应的堆栈帧时,堆栈变量也随之消失。由于全局变量被设计成在任何地方都可以访问,因此它们不能脱离上下文,因此存储在堆上(或二进制文件的特殊数据部分)而不是堆栈上。 static 变量也是如此;因为它们必须在函数调用之间保持它们的值,所以当函数返回时它们不能消失,因此它们不能在堆栈上分配。

static 变量的保护而言,IIRC 这主要由编译器完成。即使变量在堆上,您的编译器也知道该变量有效的有限上下文,并且任何从该上下文外部访问 static 的尝试都会导致“未知标识符”或类似错误.错误访问堆变量的唯一其他方法是,如果您知道 static 的地址,然后盲目地取消引用指向它的指针。这会导致运行时内存访问错误。

在多线程环境下,使用全局变量和静态变量还是可以的。但是,您必须更加小心。您必须保证一次只有一个线程可以访问该变量(通常通过某种锁定机制,例如互斥锁)。对于函数内的 static 局部变量,您必须确保如果从多个线程顺序调用函数(即从线程 1 调用,然后从线程 2 调用),您的函数仍将按预期运行,然后是线程 1,然后是线程 2,等等)。这通常很难做到,许多依赖于 static 成员变量的函数因此不是线程安全的(strtok 是一个显着的例子)。

关于c++ - 内存中的静态和全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2421254/

相关文章:

c++ - Vulkan 异步模型加载

multithreading - 识别linux内核模块中的错误

java - static volatile boolean - 线程没有被终止

java - Thread.interrupt() 被忽略

c++ - 超大矩阵的决定值

c++ - 将中缀转换为后缀表示法

c++ - 在C++编译时写入文件?

c - 在没有#including wchar 的情况下,前缀 L"..."在 GCC C 中代表什么?

c - C 中的身份验证(从给定文件读取和检查)

c - 使用C发送数据互联网