Qt 中用Q_GLOBAL_STATIC来实现线程安全的单例模式

  1. 官方说明:
    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创建的对象在第一次使用时对自身进行初始化,这意味着它不会增加应用程序或库的加载时间。此外,该对象在所有平台上都以线程安全的方式进行初始化。

  1. 使用方法:
    官方的说明中就已经说了使用方法 :Q_GLOBAL_STATIC(MyType, staticType)

  2. 实例说明:
    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();

热门相关:踏雪寻梅   烽火电波   满花房 3D   东区故事   NTR婚礼