菜鸟问一个简单的有关“设计模式”的问题。

northcan 2012-04-28 11:54:35
一直做嵌入式方面的工作,后来发现 c/c++/数据结构算法/设计模式 方面一直是技术短板。
今年的大部分业余时间,准备用来深入学习一下这些内容,今早坐公交车的时候,
看了下设计模式里面的“单例(Singleton)模式”,中午下班用c++写了一下,大家看看这么写有什么问题。
欢迎挖苦指点。(至于 设计模式 无用论方面的就不用讨论了。-_-)
...全文
1122 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
feiniao1573 2012-05-07
  • 打赏
  • 举报
回复
即使是多线程,单例也不用加锁吧!!!!
fengqiao1999 2012-05-06
  • 打赏
  • 举报
回复
加锁,是需要支持多线程么?
wojiushi3344 2012-05-05
  • 打赏
  • 举报
回复
楼主弱弱的问一句,写单一模式的时候为什么要加锁,我原来写的时候一直没有用过。能说说有什么好处吗?或者说不加锁在什么情况下会出错。
乐z者 2012-05-05
  • 打赏
  • 举报
回复
需要加一个public的删除函数。

通常singleton在程序启动的时候调用一次创建,退出的时候调用一次删除。
singleton最容易引起的问题是初始化的顺序,和删除的顺序。特别是多个模块中,所以singleton创建和删除由调用者外部控制比较好。因为调用者比较容易选择合适的位置进行创建和删除操作。

同步基本没有必要。因为如果增加一个删除函数,删除内部即时做了同步,外部也可能正在使用该指针,同步是解决不了这个问题。



michaelgz 2012-05-04
  • 打赏
  • 举报
回复
static CSyncCriSec sync; 这行有问题, function-scope 的 static variable 不 thread-safe。
deping_chen 2012-05-02
  • 打赏
  • 举报
回复
写的不错。不搞锁可能更好,一是代码简单,而是在用到这个单一实例的时候节约内存。
sevancheng 2012-05-02
  • 打赏
  • 举报
回复
static CSyncCriSec sync; 不合理
sevancheng 2012-05-02
  • 打赏
  • 举报
回复
反正没看到delete。。。。
xtjextje 2012-05-02
  • 打赏
  • 举报
回复
没有一个地方调用了单例的虚构函数.如果单例用了系统资源.则会出现问题的.
恨天低 2012-04-28
  • 打赏
  • 举报
回复
我csdn博客里刚好也有个Singleton模式的实现。呵呵
muyi66 2012-04-28
  • 打赏
  • 举报
回复
呃,又打错字......最后那行开头是“如果不管”
muyi66 2012-04-28
  • 打赏
  • 举报
回复
有个疑问:

你把标志_instance放在模板里了,在创建对象时可以通过Instance函数来改变_instance,但在析构T实例的时候又怎么把_instance重新置为NULL呢?

不过不管,那么当你析构了第一个T实例之后系统里就没有T的实例了,再想重建一个如何做呢?
nice_cxf 2012-04-28
  • 打赏
  • 举报
回复
单例模式其实没必要加锁,在程序启动时初始化一次就ok了
northcan 2012-04-28
  • 打赏
  • 举报
回复
顶一下,200分呢,欢迎大家来拿啊。-_-
Red_angelX 2012-04-28
  • 打赏
  • 举报
回复
基本OK 没什么问题 加锁代码也没问题
evencoming 2012-04-28
  • 打赏
  • 举报
回复
单例,,
这种用法只想到了内存池之类的..

其他时候只是为了控制全局变量初始化顺序的一个手段而已.
所以,无法提什么意见.

唯一的,c++里面不用推荐NULL,直接用0代替.
northcan 2012-04-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
static CSyncCriSec sync;不对,不应该这么加锁
[/Quote]

请问是为什么呢?

static CSyncCriSec sync;
sync.Lock();
if (_instance == NULL)
{
_instance = new T();
}
sync.Unlock();

sync 是一个用来同步的类的对象,static只在第一次调用的时候调用默认构造函数初始化。
这样为什么不行呢?我c++的基础很弱,请大侠讲一下原因。谢谢。-_-
  • 打赏
  • 举报
回复
static CSyncCriSec sync;不对,不应该这么加锁
northcan 2012-04-28
  • 打赏
  • 举报
回复
// 测试程序


#include <iostream>
#include "Singleton.h"

using namespace std;

class CMango
{
public:
CMango()
{
cout << "CMango Constructor(). \n" << endl;
}
};

int main()
{
CMango* m1 = CSingleton<CMango>::Instance();
CMango* m2 = CSingleton<CMango>::Instance();

cout << m1 << "\n" << m2 << endl;

return 0;
}
northcan 2012-04-28
  • 打赏
  • 举报
回复

#ifndef _SINGLETON_H_
#define _SINGLETON_H_

// Singleton 模式

#include "sync.h"
// #define NULL ((void *)0)

template <typename T>
class CSingleton
{
private:
CSingleton() {};
static T* _instance;

public:
static T* Instance()
{
// double-check locking
if (_instance == NULL)
{
static CSyncCriSec sync;
sync.Lock();
if (_instance == NULL)
{
_instance = new T();
}
sync.Unlock();

}
return _instance;
}
};

template <typename T>
T* CSingleton<T>::_instance = NULL;

#endif // #ifndef _SINGLETON_H_
加载更多回复(13)

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧