c++ - 静态变量与堆栈变量 : thread safety vs stack size?

标签 c++ static thread-safety

我有一个方法需要大量内存(与堆栈大小相比)来存储临时结果。 我正在考虑使用静态变量作为本地临时存储。

我做了一些研究,发现静态变量的初始化在 C++98 中不是线程安全的。

那么,问题是,如果我只需要空间而不关心初始化怎么办?

或者更进一步,使用静态变量作为本地存储有什么问题?

最佳答案

这不仅仅是初始化的问题。静态变量,即使是在函数中定义的变量,也是一个实例,所有对该函数的调用都共享它——甚至是不同线程中的调用。如果您使用静态变量作为暂存缓冲区,您的所有线程将共享相同 暂存缓冲区,您将需要使用显式同步来防止它们相互干扰。您还需要弄清楚如何让线程有效地共享缓冲区;如果他们都试图同时使用相同的部分并且经常不得不等待互斥锁,那么您将失去并发的好处,还不如只使用一个线程。

让函数在堆上分配它的暂存区并在返回之前删除它会容易得多。 (您可以在 C++11 中使用 std::unique_ptr 来确保在指针超出范围时删除缓冲区,或者如果您使用 std::auto_ptr重新使用 C++98。)

关于c++ - 静态变量与堆栈变量 : thread safety vs stack size?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27708155/

相关文章:

c++ - 初始化 SDL_Mixer 给出错误 "Can' t 设置 PulseAudio 流”

java - 等效静态和非静态方法的速度差异很大

javascript绘制粒子

python - 查询Python的threading.Lock是否加锁

java - 仅检查一个条件的 while true 循环线程安全吗?

java - 为什么我们要写Synchronized(ClassName.class)

c++ - 交换属性 a[i] == i[a]

c++ - Qt5 on Windows 7 Arial 字体 : Thai is very small

c++ - 带有调试选项的 gcc 编译阶段

c++ - 链表静态类成员