找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 11350|回复: 5

最好用(个人认为)的C++单例模式的实现

[复制链接]
发表于 2012-3-24 00:09:21 | 显示全部楼层 |阅读模式
先上代码:
  1. #include <iostream>
  2. using namespace std;
  3. class Singleton  
  4. {  
  5. private:  
  6.         int test;
  7.         static Singleton *instance;  
  8.         Singleton() { cout << "new" <<endl; test = 0; }
  9.         ~Singleton() { cout << "delete" << endl; }
  10. public:                  
  11.         static Singleton *GetInstance()  
  12.         {  
  13.                 static Singleton singleton;
  14.                 return &singleton;
  15.         }  
  16.         void SetValue(int v) { test = v; }
  17.         int GetValue() { return test; }
  18. };   
  19. int main()
  20. {
  21.         Singleton *single1 = Singleton::GetInstance();
  22.         Singleton *single2 = Singleton::GetInstance();
  23.         cout << "value 1: " << single1->GetValue() << endl;
  24.         single1->SetValue(100);
  25.         cout << "value 2: " << single2->GetValue() << endl;
  26.         if( single2 == single1 )
  27.                 cout << "single1 and single2 is the same object." << endl;
  28.         return 0;
  29. }
复制代码


C++单例模式的实现方式有很多种,这种是我最喜欢的,它有以下优点:
1:能正确完成单例这个目标(废话)。
2:能在适当的时候自动运行构造和析构函数。
3:能够很轻易解决线程同步的问题(在GetInstance,SetValue,GetValue等函数运行时加锁就行了)


作者:AAA20090987 发表于2012-3-22 21:47:14 原文链接


发表于 2012-3-24 10:17:31 | 显示全部楼层
还是比较喜欢模版形式的单体  不用每个要实现单体的类都修改代码
发表于 2012-3-27 10:27:51 | 显示全部楼层
SetValue,GetValue 其实是不用设置锁的 至少在windows下 int类型是线程安全的

点评

错 int在任何系统下都是不安全的, 下面我用汇编操作跳过int的操作模拟多线程操作 { inti=10; inta=i; printf("i=%d",a); //下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道 __asm { movdwordptr[e  详情 回复 发表于 2014-8-25 22:09
发表于 2012-5-4 14:12:28 | 显示全部楼层
呵呵 难怪会有这帖子----》   [原]C语言赋值语句是不是原子操作?
发表于 2013-8-12 20:26:45 | 显示全部楼层
这个实现有很多毛病,不适合工程应用
发表于 2014-8-25 22:09:42 | 显示全部楼层
wany031123 发表于 2012-3-27 10:27
SetValue,GetValue 其实是不用设置锁的 至少在windows下 int类型是线程安全的

错    int在任何系统下都是不安全的,
下面我用汇编操作跳过int的操作模拟多线程操作

{
inti=10;
inta=i;
printf("i=%d",a);
//下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道
__asm
{
movdwordptr[ebp-4],20h
}
intb=i;
printf("i=%d",b);
}

debug下   确实能读出原有的值,  但是release下,编译器直接使用寄存器的值 ,即多线程操作了堆栈后,你主线程还在用寄存器,完全不知道数据已修改   
你家里将代码调试完毕   放到甲方那边一跑各种偶现问题
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-21 16:55 , Processed in 0.025088 second(s), 7 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表