c++98标准是不安全的。c11标准是线程安全的。
局部静态变量,局部静态变量就是定义在函数内部的静态变量,它的初始化发生在该函数第一次被
调用时,当执行到局部静态变量定义语句时进行初始化的。
利用这一点可以实现懒汉式单例模式
static Singleton & getInstance(){static Singleton instance;return instance;}
但在c++/98标准中,这一代码并不是线程安全的,因为上述代码相当于编译器帮你生成了是否
初始化的过程,但是没有考虑线程安全。
static Singleton& instance(){static bool initialized = false;static char buf[sizeof(Singleton)];if (!initialized){initialized = true;new(&buf)Singleton();}return (*(reinterpret_cast(&buf)));}
c++11改进了这一情况,保证了线程安全。
1.若初始化抛出异常将继续保持未初始化状态
2.若正在初始化,其它运行初始化语句线程将被阻塞
3.若正在初始化的线程递归调用初始化语句行为未定义。
![e52998279509f1a83adfaa135328d69b.png](https://i-blog.csdnimg.cn/blog_migrate/e5a3b2ac3f857b662a4008af605c6ba6.jpeg)