首页 > 其他分享 >Qt 中用Q_GLOBAL_STATIC来实现线程安全的单例模式

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

时间:2024-05-14 17:18:49浏览次数:20  
标签:Singleton Qt int GLOBAL SINGLETON value 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();

标签:Singleton,Qt,int,GLOBAL,SINGLETON,value,STATIC,线程
From: https://www.cnblogs.com/TigerSpirit/p/18191779

相关文章

  • Python 内置库 多线程threading使用讲解
    线程基本使用单线程defmain():print("在扔一个苹果")if__name__=="__main__":main()多线程Python提供了thread、threading等模块来进行线程的创建与管理,后者在线程管理能力上更进一步,因此我们通常使用threading模块。创建一个线程需要指定该线程执行的任务(函......
  • 多线程循环控制字段失效造成死循环的坑
    编程的时候遇到一个场景:A,B两个线程,B是一个while(flag),有个控制字段flag,刚开始是trueB会一直循环,A某个情况回把flag置为false,但是如果B的循环里什么都没干,就一直不退出,陷入死循环本来以为是哪里逻辑写错了,于是在B里面加入了一个printf,没想到结果就能正常退出了 ......
  • Advanced .Net Debugging 8:线程同步
    一、介绍这是我的《Advanced.NetDebugging》这个系列的第八篇文章。这篇文章的内容是原书的第二部分的【调试实战】的第六章【同步】。我们经常写一些多线程的应用程序,写的多了,有关多线程的问题出现的也就多了,因此,最迫切的任务就是提高解决多线程同步问题的能力。这一节......
  • N1CTF2018 shopping:多线程堆题中堆溢出的应用
    介绍一种在多线程堆题中利用堆溢出达成任意地址分配的手法。我们知道,一个进程的主线程的堆管理main_arena在libc中,分配的chunk在堆段中。那么子线程的arena和堆块都在哪里呢?这一大串在libc前面一点点的anon就是给子线程留的arena和堆空间。arena和tcache管理chunk在这个内存段......
  • QT开发工具QTCreator设置格式美化,代码补全提示
    工欲善其事,必先利其器:下面介绍如何配置格式美化功能(1)先下载:astyle.exe (2)编辑astyle.astylerc点击Apply->OK (3)帮助 重启软件:测试效果 格式化化后: ......
  • Qt 信号槽连接方式
    Qt的使用这个函数处理信号voidQMetaObject::activate(QObject*sender,intsignalOffset,intlocal_signal_index,void**argv) 多线程情况下:直连或者队列连接使用 queued_activate()处理:阻塞连接(BlockingQueuedConnection)相同线程直接调用,不同线程使用事件处理:......
  • 聊一聊关于线程池的那些事情
     在现代软件开发中,线程池是一种广泛应用的并发执行模式,尤其在处理大量短暂异步任务的场景中,线程池能够提高程序性能,减少资源消耗。本文将深入探讨Java线程池的工作原理,包括其核心参数、执行过程以及应用场景等方面。一、线程池的核心参数Java线程池在java.util.concurrent包下......
  • libuv线程
    1、概述  libuv的线程API与Linux的pthread的API在使用方法和语义上很接近,因为要跨平台,所以libuv支持的线程API个数很有限。libuv中只有一个主线程,主线程上只有一个eventloop。如下为创建线程的一个简单示例:#include<stdio.h>#include<uv.h>voidthread_fun(void*arg)......
  • C#异步与多线程
    c#的异步与多线程异步与多线程首先,异步是相对于同步的一个概念,在同步环境下,程序允许至某处需要等待的位置,会发生阻塞,直到达到条件才会继续向下运行;而异步操作则可以在需要等待的位置,跳过等待,执行其他内容,通常异步处理的事务不能相互存在影响。多线程指的是,同时使用多个线程执行......
  • WinForm中UI控件不支持从非创建控件的线程进行访问
    背景在WindowsForms应用程序中,UI控件(如按钮、文本框等)被设计为不支持从非创建控件的线程(通常是主UI线程)进行访问。尝试从其他线程访问UI控件会导致不可预测的行为,包括应用程序崩溃。Control.CheckForIllegalCrossThreadCalls属性用于在调试过程中帮助开发者发现这类潜在问......