天天看点

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

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 );

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

~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