【发布时间】:2019-08-09 16:01:28
【问题描述】:
以下代码是在C++11 中使用std::call_once 的替代singleTon 类的实现。基本上,变量static_instance 与static_flag 一起静态声明,一旦调用getInstance 函数(也是静态函数),我使用call_once 创建mySingle 的第一个也是唯一一个实例。
我很高兴听到任何 cmets 关于线程安全方面的代码正确性,以及它的行为是否不同于在 getinstance 中定义静态变量的标准 C++ 实现。
mySingle.h
class mySingle
{
static mySingle *static_instance;
static std::once_flag static_flag;
public:
mySingle();
virtual ~mySingle();
static mySingle* getInstance();
};
mySingle.cpp
#include "mySingle.h"
mySingle * mySingle::static_instance;
std::once_flag mySingle::static_flag;
mySingle::mySingle(){}
mySingle::~mySingle(){}
mySingle* mySingle::getInstance()
{
std::call_once(g_flag, [&]() { static_instance = new mySingle(); });
return (mySingle*) static_instance;
}
【问题讨论】:
-
第一个想法是乱七八糟的 - 你为什么要把像典型的静态变量单例一样简单的事情复杂化?
-
原因是在windows中(至少这是我检查过的),标准实现使用对线程本地存储的访问(如果你反汇编编译的代码,你会看到对寄存器
gs:[58h]的访问这是 TLS。我希望避免这种情况。 -
看这篇文章:modernescpp.com/index.php/thread-safe-initialization-of-data,看看 scott meyers singleton
-
@Gojita,很棒的文章,谢谢!
标签: c++ c++11 design-patterns singleton std