静态变量与堆栈变量:线程安全与堆栈大小

static variable vs stack variable: thread safety vs stack size?

本文关键字:堆栈 变量 安全 静态 线程      更新时间:2023-10-16

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

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

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

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

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

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

静态变量只存在一次。这意味着如果你的多线程代码需要两个线程的空间,你就不走运了。总有一天它会咬你。

静态变量永远存在。这意味着一旦你完成了需要空间的任务,空间就永远消失了。那会从第一天起就咬你。

如果您需要的内存

多于您愿意在堆栈上分配的内存(并且许多实现对堆栈内存的限制要严格得多),请在堆上分配内存,并在完成它时释放它。