最好用(个人认为)的C++单例模式的实现
先上代码:#include <iostream>
using namespace std;
class Singleton
{
private:
int test;
static Singleton *instance;
Singleton() { cout << "new" <<endl; test = 0; }
~Singleton() { cout << "delete" << endl; }
public:
static Singleton *GetInstance()
{
static Singleton singleton;
return &singleton;
}
void SetValue(int v) { test = v; }
int GetValue() { return test; }
};
int main()
{
Singleton *single1 = Singleton::GetInstance();
Singleton *single2 = Singleton::GetInstance();
cout << "value 1: " << single1->GetValue() << endl;
single1->SetValue(100);
cout << "value 2: " << single2->GetValue() << endl;
if( single2 == single1 )
cout << "single1 and single2 is the same object." << endl;
return 0;
}
C++单例模式的实现方式有很多种,这种是我最喜欢的,它有以下优点:
1:能正确完成单例这个目标(废话)。
2:能在适当的时候自动运行构造和析构函数。
3:能够很轻易解决线程同步的问题(在GetInstance,SetValue,GetValue等函数运行时加锁就行了)
作者:AAA20090987 发表于2012-3-22 21:47:14 原文链接
还是比较喜欢模版形式的单体不用每个要实现单体的类都修改代码 SetValue,GetValue 其实是不用设置锁的 至少在windows下 int类型是线程安全的 呵呵 难怪会有这帖子----》 [原]C语言赋值语句是不是原子操作? 这个实现有很多毛病,不适合工程应用 wany031123 发表于 2012-3-27 10:27
SetValue,GetValue 其实是不用设置锁的 至少在windows下 int类型是线程安全的
错 int在任何系统下都是不安全的,
下面我用汇编操作跳过int的操作模拟多线程操作
{
inti=10;
inta=i;
printf("i=%d",a);
//下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道
__asm
{
movdwordptr,20h
}
intb=i;
printf("i=%d",b);
}
debug下 确实能读出原有的值,但是release下,编译器直接使用寄存器的值 ,即多线程操作了堆栈后,你主线程还在用寄存器,完全不知道数据已修改
你家里将代码调试完毕 放到甲方那边一跑各种偶现问题
页:
[1]