静态变量与堆栈变量:线程安全与堆栈大小
static variable vs stack variable: thread safety vs stack size?
我有一个需要大量内存(与堆栈大小相比)来存储临时结果的方法。我正在考虑使用静态变量作为本地临时存储。
我做了一些研究,发现静态变量的初始化在 C++98 中不是线程安全的。
所以,问题是,如果我只需要空间而不关心初始化怎么办?
或者,进一步,使用静态变量作为本地存储有什么问题?
这不仅仅是初始化的问题。 静态变量(即使是在函数中定义的变量)也是对该函数的所有调用共享的单个实例,甚至是不同线程中的调用。 如果使用静态变量作为暂存缓冲区,则所有线程将共享同一个暂存缓冲区,并且需要使用显式同步来防止它们相互干扰。 您还需要弄清楚如何使线程有效地共享缓冲区;如果它们都尝试同时使用相同的部分,并且经常需要等待互斥锁,那么您将失去并发的好处,并且可能只使用单个线程。
让函数在堆上分配其暂存区域并在返回之前将其删除会容易得多。 (可以使用 C++11 中的std::unique_ptr
来确保在指针超出范围时删除缓冲区,如果卡住 C++98,则可以std::auto_ptr
缓冲区。
静态变量只存在一次。这意味着如果你的多线程代码需要两个线程的空间,你就不走运了。总有一天它会咬你。
静态变量永远存在。这意味着一旦你完成了需要空间的任务,空间就永远消失了。那会从第一天起就咬你。
如果您需要的内存多于您愿意在堆栈上分配的内存(并且许多实现对堆栈内存的限制要严格得多),请在堆上分配内存,并在完成它时释放它。
相关文章:
- 堆栈变量超出范围时是否解除分配?
- 堆栈变量和函数C++奇怪的行为
- 野牛堆栈变量中的值分配
- 局部堆栈变量成员的返回值优化
- 访问其他线程堆栈变量如何在C++中工作?
- 指向堆栈变量的指针是否易失
- 是否可以 std::move 局部堆栈变量?
- 返回堆栈变量时停止调用析构函数
- 优化易失性堆栈变量的存储/构造是否合法
- SEGFAULT正在写入堆栈变量
- 汇编:C++堆栈变量地址不同/错误?
- C++11 Lambda闭包通过引用涉及一个堆栈变量,该变量离开作用域是允许的,但得到了未定义的行为
- 返回堆栈变量
- Visual Studio 在引用堆栈变量时不使用 EBP
- 堆栈变量或函数声明
- 访问堆栈变量的速度比取消引用指针慢
- 静态变量与堆栈变量:线程安全与堆栈大小
- 堆栈变量生存期好奇的例子
- 如何查找未初始化的堆栈变量
- 如何为堆栈变量分配内存