Qt 中用Q_GLOBAL_STATIC来实现线程安全的单例模式
- 官方说明:
Qt中有个宏Q_GLOBAL_STATIC 可以用来创建一个全局静态变量,下面看下官方文档的说明:
Q_GLOBAL_STATIC(Type, VariableName)
Creates a global and static object of type QGlobalStatic, of name VariableName and that behaves as a pointer to Type. The object created by Q_GLOBAL_STATIC initializes itself on the first use, which means that it will not increase the application or the library's load time. Additionally, the object is initialized in a thread-safe manner on all platforms.
The typical use of this macro is as follows, in a global context (that is, outside of any function bodies):
Q_GLOBAL_STATIC(MyType, staticType)
官方文档说的意思是:
创建名为VariableName的QGlobalStatic类型的全局和静态对象,其行为类似于指向Type的指针。由Q_GLOBAL_STATIC创建的对象在第一次使用时对自身进行初始化,这意味着它不会增加应用程序或库的加载时间。此外,该对象在所有平台上都以线程安全的方式进行初始化。
-
使用方法:
官方的说明中就已经说了使用方法 :Q_GLOBAL_STATIC(MyType, staticType)
-
实例说明:
singleton.h
#ifndef SINGLETON_H
#define SINGLETON_H
#include <QGlobalStatic>
#define SINGLETON Singleton::instance()
class Singleton
{
public:
Singleton() {}
virtual ~Singleton() {}
public:
static Singleton* instance();
public:
void setValue(int value);
int getValue();
prive:
int m_value;
};
#endif // SINGLETON_H
singleton.cpp
#include "singleton.h"
Q_GLOBAL_STATIC(Singleton, theSingleton)
Rule* Singleton::instance()
{
return theSingleton();
}
void Singleton::setValue(int value)
{
m_value = value);
}
int Singleton::getValue()
{
return m_value;
}
调用方法:
如上面的单例在需要调用的地方可以用如下方法来赋值和取值:
Singleton::instance()->setValue(520);
int value = Singleton::instance()->getValue();
也可以直接用定义的宏来调用
SINGLETON->setValue(520);
int value = SINGLETON->getValue();