考虑到线程安全的双重检查锁定(对于单例或懒惰初始化),我已经阅读了很多问题。在某些线程中,答案是模式完全被破坏,其他人建议解决方案。
所以我的问题是:有没有办法在C ++中编写一个完全线程安全的双重检查锁定模式?如果是这样,它看起来如何。
我们可以假设C ++ 11,如果这样可以让事情变得更容易。据我所知,C ++ 11改进了内存模型,可以产生所需的改进。
我知道通过使用双重检查保护变量volatile可以在Java中实现。由于C ++ 11从Java中借用了大部分内存模型,所以我认为它可能,但是如何?
答案 0 :(得分:17)
只需使用静态局部变量进行延迟初始化的单例,如下所示:
MySingleton* GetInstance() {
static MySingleton instance;
return &instance;
}
(C ++ 11)标准已经保证静态变量以线程安全的方式初始化,并且它的实现似乎至少与您自己编写的任何内容一样强大且高效。
初始化的安全性可以在(C ++ 11)标准的第6.6.4节中找到:
如果控件在初始化变量时同时进入声明,则并发执行应等待初始化完成。
答案 1 :(得分:3)
由于您希望看到有效的DCLP C ++ 11实现,因此这里有一个。
该行为完全是线程安全的,与Grizzly的答案中的dataframe rows
相同。
GetInstance()