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

  • 相关阅读:
    两个页面相同js方法兼容
    两个页面js方法兼容
    jQuery Chosen 使用
    我写的一个抓取基金净值的工具
    自己做的一个固定大小对象内存池,效率大概为原始的new/delete的2倍
    用libevent实现的echo服务器及telnet客户端
    共享一个防止脚本重复启动的shell脚本
    神煞排盘软件
    一个在字符串中查找多个关键字的函数strstrs(三种不同算法实现及效率分析)
    写了一个时间处理的类,能将人类时间转换成距离公元零年一月一日秒数(时间戳),同时支持时间戳转换成日期时间
  • 原文地址:https://www.cnblogs.com/findumars/p/11553550.html
Copyright © 2011-2022 走看看