版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wsj18808050/article/details/51603006
在GUN标准中,提供了__thread关键字,配合static后,可以实现让一个线程拥有自己的全局变量。

我对__thread进行了简单的封装,可以用于存储class。并且防止了内存泄露(如果使用Qt线程类)。

测试中,我一共开启了两个线程,从输出可以得知每个线程都拥有自己的变量,并且在线程退出后被正常释放。

测试代码:

// Qt lib import
#include <QtCore>
#include <QtConcurrent>

class MyClass
{
public:
MyClass()
{
qDebug() << "MyClass" << this << QThread::currentThread();
}

~MyClass()
{
qDebug() << "~MyClass" << this << QThread::currentThread();
}
};

template< class T >
class ThreadStore
{
public:
T &getQuote()
{
if ( !t )
{
t = new T;

auto thread = qobject_cast< QThread * >( QThread::currentThread() );
if ( thread && thread->isRunning() )
{
QObject::connect( QThread::currentThread(), &QThread::finished, [ this ]()
{
if ( t )
{
delete t;
t = nullptr;
}
} );
}
}

return *t;
}

private:
T *t;
};

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

auto myTest = []()
{
static __thread ThreadStore< MyClass > threadStore;

auto &myData = threadStore.getQuote();

qDebug() << "myData:" << &myData;

QThread::sleep( 1 );
};

QThreadPool::globalInstance()->setMaxThreadCount( 2 );

QtConcurrent::run( myTest );
QtConcurrent::run( myTest );
QtConcurrent::run( myTest );
QtConcurrent::run( myTest );

QThreadPool::globalInstance()->waitForDone();

return a.exec();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
输出结果:

MyClass 0x7fe842e09b10 QThread(0x7fe842d0cbe0, name = "Thread (pooled)")
MyClass 0x7fe842c1d6a0 QThread(0x7fe842d0df60, name = "Thread (pooled)")
myData: 0x7fe842e09b10
myData: 0x7fe842c1d6a0
myData: 0x7fe842e09b10
myData: 0x7fe842c1d6a0
~MyClass 0x7fe842e09b10 QThread(0x7fe842d0cbe0, name = "Thread (pooled)")
~MyClass 0x7fe842c1d6a0 QThread(0x7fe842d0df60, name = "Thread (pooled)")
————————————————
版权声明:本文为CSDN博主「Jason188080501」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wsj18808050/article/details/51603006

Qt:用 __thread 关键字让每个线程有自己的全局变量的更多相关文章

  1. gcc 中__thread 关键字的示例代码

    __thread 关键字的解释:   Thread Local Storage  线程局部存储(tls)是一种机制,通过这一机制分配的变量,每个当前线程有一个该变量的实例. gcc用于实现tls的运行 ...

  2. __thread关键字[转]

    自 http://blog.csdn.net/liuxuejiang158blog/article/details/14100897 __thread是GCC内置的线程局部存储设施,存取效率可以和全局 ...

  3. Qt之可重入与线程安全

    简述 本篇文章中,术语"可重入性"和"线程安全"被用来标记类与函数,以表明它们如何被应用在多线程应用程序中. 一个线程安全的函数可以同时被多个线程调用,甚至调用 ...

  4. [转] __thread关键字

    http://blog.csdn.net/liuxuejiang158blog/article/details/14100897 __thread是GCC内置的线程局部存储设施,存取效率可以和全局变量 ...

  5. 多线程编程--- __thread关键字

    __thread是GCC内置的线程局部存储设施,存取效率可以和全局变量相比.__thread变量每一个线程有一份独立实体,各个线程的值互不干扰.可以用来修饰那些带有全局性且值可能变,但是又不值得用全局 ...

  6. 【Qt开发】事件循环与线程 二

    事件循环与线程 二 Qt 线程类 Qt对线程的支持已经有很多年了(发布于2000年九月22日的Qt2.2引入了QThread类),Qt 4.0版本的release则对其所有所支持平台默认地是对多线程支 ...

  7. 【Qt开发】事件循环与线程 一

    事件循环与线程 一 初次读到这篇文章,译者感觉如沐春风,深刻体会到原文作者是花了很大功夫来写这篇文章的,文章深入浅出,相信仔细读完原文或下面译文的读者一定会有收获. 由于原文很长,原文作者的行文思路是 ...

  8. Qt多线程编程中的对象线程与函数执行线程

    近来用Qt编写一段多线程的TcpSocket通信程序,被其中Qt中报的几个warning搞晕了,一会儿是说“Cannot create children for a parent that is in ...

  9. QT信号和槽在哪个线程执行问题

    时隔四个月后的第一篇,换了个公司可以登录的博客,记录一些学习内容吧 这是看到别人写的比较好的一篇,排版有点乱 QThread的使用方法 起源 昨天不小心看到Qt开发人员( Bradley T.Hugh ...

随机推荐

  1. 交互式报告系统 Dr. Tom | 华大基因培训资料

    华大科技服务开发一套优秀的交互式结题报告系统,适用于没有代码基础的老师分析自己的数据. http://report.bgi.com/ps/login/login.html 体验之后再做评价! 见云盘: ...

  2. Android开发--IntentService的用法,你错过了什么

    Android开发--IntentService的用法,你错过了什么 . 本文链接:https://blog.csdn.net/smbroe/article/details/45009721 Inte ...

  3. dtypes.py", line 499 _np_qint8 = np.dtype([("qint8", np.int8, (1,)])

    Traceback (most recent call last): File "<stdin>", line 1, in <module> File &q ...

  4. IoAllocateMdl,MmProbeAndLockPages的用法

    转载地址:https://blog.csdn.net/wdykanq/article/details/7752909 IoAllocateMdl,MmProbeAndLockPages的用法 第一,M ...

  5. DataGrip 2019.1 连接mysql 8.0.16

    # 下载mysql Connector/J驱动包 https://dev.mysql.com/downloads/connector/j/ 然后解压到一个目录 # 新建mysql 8.0连接驱动 打开 ...

  6. 判断本网段有多少可用的ip地址

    为了提高效率,使用多线程方式同时ping. 但是如果开启255个线程,又会因为网络端口太拥挤,会被判定为无法ping通.所以本例使用java自带线程池,线程池的连接数还不能太大,启动了15个线程. 等 ...

  7. Locust性能测试-分布式执行的方法(亲测ok)

    来源:https://www.cnblogs.com/yoyoketang/p/11681370.html 前言 使用Locust进行性能测试时,当一台单机不足以模拟所需的用户数量的时候,可以在多台机 ...

  8. Linux系统调优——Memory内存(二)

    (1).查看Memory(内存)运行状态相关工具 1)free命令查看内存使用情况 [root@youxi1 ~]# free -m //-m选项,以MB为单位显示 total used free s ...

  9. 邪淫真正的可怕危害 (转自学佛网:http://www.xuefo.net/nr/article54/544414.html)

    邪淫真正的可怕危害 邪淫的害处可能很快就显现,也可能是逐渐的表现出来.但往往后者的害处更大.因为当积累了多年的邪淫果报一旦显现,后悔就已经晚了. 我本人就是一个很好的例子.回想自己这40多年的日子,邪 ...

  10. 报错:Error, CM server guid updated, expected xxxxx, received xxxxx (未解决)

    报错背景: CDH断电重启后,cloudera-scm-server启动报错, cloudera-scm-server 已死,但 pid 文件仍存 由于没有成熟的解决方案,于是我就重新安装了MySQL ...