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

时间:2014-12-30 15:30:18

标签: c++ static thread-safety

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

让函数在堆上分配其临时区域并在返回之前删除它会容易得多。 (您可以在C ++ 11中使用std::unique_ptr以确保在指针超出范围时删除缓冲区,或者std::auto_ptr如果您仍然坚持使用C ++ 98。)< / p>

答案 1 :(得分:0)

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

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

如果你需要更多的内存而不是你愿意在堆栈上分配(并且许多实现对堆栈内存有更严格的限制),那么在堆上分配内存,并在完成后释放它。