zoukankan      html  css  js  c++  java
  • Qt:用 __thread 关键字让每个线程有自己的全局变量

    版权声明:本文为博主原创文章,遵循 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

  • 相关阅读:
    java StringBuilder和StringBuffer 用法
    java 包装类
    java 异常机制
    java Scanner类的使用
    java Arrays数组
    java 二维数组和对象数组
    LeaFlet学习之结合turf.js生成简单的等值线demo
    Openlayer给定坐标进行绘制多边形
    LeaFlet学习之GridLayer扩展
    LeaFlet学习之聚合效果
  • 原文地址:https://www.cnblogs.com/findumars/p/11553550.html
Copyright © 2011-2022 走看看