使用 std::call_once 实现类似单例的功能
Realize a singleton-like functionality using std::call_once
我想使用 std::call_once 实现类似单例的功能,只是为了好玩,或者也许可以改进单例模式本身。这是我到目前为止尝试过的,但我被卡住了。任何帮助将不胜感激。
class single {
public:
private:
single(){}
friend void boo(unique_ptr<single>&);
};
void boo(unique_ptr<single>& f) {
f.reset(new single());
}
unique_ptr<single>& bar() {
static once_flag flag;
static unique_ptr<single> f;
call_once(flag, boo,f);
return f;
}
int main()
{
unique_ptr<single> f;
f = move(bar());
unique_ptr<single> f2;
f2 = move(bar()); // this should not work but it does, work-around?
}
static
就足够了。它为您执行线程安全初始化,无需call_once
:
如果多个线程尝试同时初始化同一个静态局部变量,则初始化只发生一次(对于具有
std::call_once
的任意函数,可以获得类似的行为(。注意:此功能的常规实现使用双重检查锁定模式的变体,这将已初始化的本地静态的运行时开销减少到单个非原子布尔比较。
因此:
unique_ptr<single>& bar() {
static unique_ptr<single> f{new single};
return f;
}
或更好:
single& bar() {
static single f;
return f;
}
相关文章:
- 为什么在单例中,检查类==空?
- C++ 实现模板单例类时出现链接错误
- 在类中存储单例的指针
- C++中的单例实现在调用 getInstance 函数时不会产生相同的类实例
- 具有非默认构造函数的单例类
- 使用 std::call_once 实现类似单例的功能
- 为什么单例使用指针而不是引用?
- 提升单例池release_memory vs purge_memory
- 具有 QObject 继承的单例 - Qt
- 单例类析构函数无法清理 (SDL_Quit) MinGW
- C++单例,不会为此文档加载任何符号
- 使用 CRTP 实现单例
- C++单例模板类使我的程序崩溃
- 初学者C++线程安全单例设计
- 派生类是单例是否是一种好的做法
- _CrtIsValidHeapPointer(块)错误在应用单例-帕特恩后退出主窗口时引发
- 在这种单例实施中,是否可以对两个商店重新排序?
- 这是MSVC 2013中具有共享PTR的单例的正确实现吗?
- C 交叉相关单例.在没有朋友的情况下,我如何使用彼此的功能
- 如何调用单例中的Overriden功能