C++ 中的线程安全单例实现

2024-01-19

以下是 C++ 中单例模式的一个众所周知的实现。
但是,我不完全确定它是否是线程安全的。
根据之前对类似问题的回答,它似乎是线程安全的。
是这样吗?

//Curiously Recurring Template Pattern    
//Separates a class from its Singleton-ness (almost).    
#include <iostream>  
using namespace std;

template<class T> class Singleton {
  Singleton(const Singleton&);
  Singleton& operator=(const Singleton&);
protected:
  Singleton() {}
  virtual ~Singleton() {}
public:
  static T& instance() {
    static T theInstance;
    return theInstance;
  }
};

// A sample class to be made into a Singleton
class MyClass : public Singleton<MyClass> {
 int x;
protected:
  friend class Singleton<MyClass>;
  MyClass() { x = 0; }
public:
 void setValue(int n) { x = n; }
  int getValue() const { return x; }
};

不,这不是线程安全的,因为静态局部不受任何方式的保护。默认情况下,静态局部变量不是线程安全的。这意味着您可能会遇到以下问题

  • 单例的构造函数运行多次
  • 对静态的分配不能保证是原子的,因此您可以在多线程场景中看到部分分配
  • 可能还有一些我还缺少的。

这是 Raymond Chen 撰写的详细博客文章,介绍了为什么 C++ 静态默认情况下不是线程安全的。

  • http://blogs.msdn.com/oldnewthing/archive/2004/03/08/85901.aspx http://blogs.msdn.com/oldnewthing/archive/2004/03/08/85901.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 中的线程安全单例实现 的相关文章

随机推荐

  • 尝试使用 ServerManager 获取应用程序池时出现 COMException

    当我尝试使用以下代码从远程服务器获取 IIS 应用程序池列表时 List
  • 我应该在 graphql 模式文件中将每个对象作为“输入”和“类型”写入两次吗

    我必须在 GraphQL 中使用 Java 对象来响应和请求 我是否必须在 GraphQL 架构文件中将每个对象作为 输入 和 类型 写入两次 用于在请求和响应中获取该对象 我应该使用输入和类型定义同一个对象两次吗 file test gr
  • VS2010 - 文件新菜单缺少“新项目”

    一位同事刚刚从 MSDN 安装了 Visual Studio 2010 Premium 安装运行得很好 但是当他单击 文件 菜单时 他只有 新文件 在我的安装中 我看到一个 新建 菜单 其中包含一个子菜单 其中包含项目 文件 团队项目 关于
  • 在非模式对话框中阻止 ESC 和 Enter 键(Win32、非 MFC)

    有一些关于这个主题的文章 但没有一篇适合我的情况 我正在使用 Win32 无 MFC 编写以下内容 目标是防止ESC or ENTER键关闭非模式对话框 这是对话框模板 IDD DIALOG 1 DIALOGEX 0 0 345 179 S
  • Web应用Nat穿越

    我们正在全国各地的客户端计算机上使用 Tomcat 部署 Java Web 应用程序 一旦安装完毕 我们希望允许通过中央服务器远程访问这些 Web 应用程序 但我们不希望我们的客户端必须在其路由器上打开端口 有没有办法通过隧道传输 http
  • 如何使用gradle在Android Studio中导入远程库?

    我正在尝试导入 android swipelistview https github com 47deg android swipelistview https github com 47deg android swipelistview
  • C# 中的不可变类型和属性

    C 中的不可变类型和不可变属性是什么意思 你能举个简单的例子吗 不可变类型是其属性只能在初始化时设置的类型 一旦创建了对象 就无法再更改任何内容 不可变属性只是只读属性 在下面的示例中 ImmutableType是一种具有一个属性的不可变类
  • SQL服务器T-SQL语句

    我有一个表 其名称 UserData 及其包含一个列名称 用户信息 UserInfo 列包含以下值 例如 演示 acc in 瑞士网 澳大利亚大学教育网 我想从中提取以下信息 Output demo swiss austa 预先感谢您的帮助
  • cmake 中 -D 选项中的间距

    D CMAKE C COMPILER是我用来选择编译器的 但是 如果我有打开 关闭的 CMake 选项 例如USEIPHONEFLAG 我需要去做 DUSEIPHONEFLAG 1 D USEIPHONEFLAG 1不起作用 我想知道之后的
  • 如何从相机获取全尺寸位图?

    我已经使用意图来启动相机 Intent cameraIntent new Intent android provider MediaStore ACTION IMAGE CAPTURE getParent startActivityForR
  • 设置当前代理设置

    I used SCDynamicStoreCopyProxies检索代理信息 我希望一旦有了字典 我就能够设置当前的代理设置 结果发现字典返回的是SCDynamicStoreCopyProxies是只读的 如何更改当前的代理设置 到目前为止
  • Win8 是否也为旧版应用程序添加了内置拼写检查器?

    根据MSDN http msdn microsoft com en us library windows desktop hh869748 28v vs 85 29 aspx 在 Windows 8 中 内置拼写检查来编辑控件 好吧 我在我
  • 根据 WooCommerce 中的自定义字段值将文本添加到订单摘要

    我已成功将自定义字段添加到我的 WooCommerce 结帐页面 该字段是客户可以选择从中提取商品的不同商店的选择器 目前 它在结帐页面上显示此字段 我正在使用 jQuery 在选择器下方添加信息并相应地更新运费 接下来我需要做的是在客户的
  • iOS 崩溃:未加载库 mremap_encrypted

    应用程序审查团队说我的应用程序总是在启动时崩溃 他们给了我一些崩溃日志 如下所示 Dyld Error Message Dyld Message Library not loaded rpath RestKit framework Rest
  • 打印二维列表的Pythonic方法——Python

    我有一个这样的二维字符列表 a 1 2 3 4 5 6 7 8 9 将列表作为整个块打印的最 Pythonic 方法是什么 IE 没有逗号或括号 123 456 789 有很多方法 大概是一个str join的映射的str joins gt
  • 判断不定冠词的Javascript库

    是否存在用于确定名词的不定冠词 a 与 an 的 JavaScript 库 我可以从一个简单的正则表达式开始 如下所示 var pattern aeiou i pattern test umbrella 但这不能处理像这样的情况 user
  • int foo = foo 的标准参考

    int foo foo 编译 C 标准的哪一部分允许这样做 3 3 1 声明点 basic scope pdecl 名称的声明点紧接在其完整声明符 第 8 条 之后和其初始值设定项 如果有 之前 如果声明位于文件范围内 则行为已明确定义 如
  • 如何放心地比较\断言双值

    我正在尝试将 JSON 中的 assert double 与java 原始double 值进行比较 正确的做法是什么 我用简单而常规的方式来做到这一点 使用Matchers equalTo方法见下文 public class A priva
  • Java:相当于Python的范围(int,int)?

    Java 有与 Python 相当的东西吗range int int method 老问题 新答案 针对 Java 8 IntStream range 0 10 forEach n gt System out println n 或使用方法
  • C++ 中的线程安全单例实现

    以下是 C 中单例模式的一个众所周知的实现 但是 我不完全确定它是否是线程安全的 根据之前对类似问题的回答 它似乎是线程安全的 是这样吗 Curiously Recurring Template Pattern Separates a cl