2009年2月10日星期二

关于Nebula3的单例

Nebula3中有两种形式的单例:

1.使用__DeclareSingleton宏定义的单例,这是一种在线程中的单例。在每个线程中只有一个对象,但在整个应用程序中可能会有多个。

把__DeclareSingleton宏展开如下:

public:
ThreadLocal static type * Singleton;
static type * Instance() { n_assert(0 != Singleton); return Singleton; };
static bool HasInstance() { return 0 != Singleton; };

可以看见我们定义了一个由ThreadLocal修饰的静态属性,在types.h中,我们可以看到ThreadLocal是如下定义的:

#if __WIN32__
#define ThreadLocal __declspec(thread)

简单地说__declspec(thread)声明一个线程局部变量并具有线程存储时限,以便链接器安排在创建线程时自动分配的存储。

在Nebual3引擎中大量地使用这种形式的单例,这和整个的Nebula3的多线程架构设计相关。

2.使用__DeclareInterfaceSingleton宏定义单例,这就是全局单例了,在整个应用程序中只存在一个对象。

展开__DeclareInterfaceSingleton宏:

static type * Singleton;
static type * Instance() { n_assert(0 != Singleton); return Singleton; };
static bool HasInstance() { return 0 != Singleton; };

没有评论:

发表评论