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中的线程安全单例所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)