C 11中的线程安全单例

C 11中的线程安全单例,第1张

概述我知道以下是在C 11中实现单例的一种线程安全的方法: Foo* getInst(){ static Foo* inst = new Foo(...); return inst;} 我在this answer中读到以下内容也是线程安全的: Foo& getInst(){ static Foo inst(...); return inst;} 它真的是线程安全 我知道以下是在C 11中实现单例的一种线程安全的方法:

Foo* getInst(){    static Foo* inst = new Foo(...);    return inst;}

我在this answer中读到以下内容也是线程安全的:

Foo& getInst(){    static Foo inst(...);    return inst;}

它真的是线程安全的吗?
将Foo的实例分配到单个堆栈帧中不会在堆上分配是不是一个问题?

如果它是线程安全的,是否有充分的理由选择一个到另一个?

解决方法@H_502_27@ 静态变量未在堆栈上分配.在第一个变体中,您有一个静态指针(一个全局变量),它是用从堆中​​获取的内存初始化的,而在第二个变体中,您有一个完整的静态对象.

两个版本都使用内部编译器保护(即__cxa_guard_acquire()和__cxa_guard_release(),它们在功能上等同于mutex :: lock()和mutex :: unlock())以确保对特殊变量的序列化访问,该变量告知您的全局实例已经初始化或未初始化.

你的代码:

Foo& getInst(){    static Foo inst(...);    return inst;}

编译后实际上看起来像这样:

Foo& getInst(){    static Foo inst; // uninitialized - zero    static guard instGuard; // zero    if (is_initialized(instGuard) == false)    {        __cxa_guard_acquire(instGuard);        // do the initialization here - calls Foo constructor        set_initialized(instGuard);        __cxa_guard_release(instGuard);    }    return inst;}

所以你的两个例子都是线程安全的.

总结

以上是内存溢出为你收集整理的C 11中的线程安全单例全部内容,希望文章能够帮你解决C 11中的线程安全单例所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1221266.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存