linux线程局部存储,C++11多线程-线程局部存储(thread_local)

线程局部存储在其它语言中都是以库的形式提供的(库函数或类)。但在C++11中以关键字的形式,做为一种存储类型出现,由此可见C++11对线程局部存储的重视。C++11中有如下几种存储类型:

序号

类型

备注

1

auto

该关键字用于两种情况:

1. 声明变量时: 根据初始化表达式自动推断变量类型。

2. 声明函数作为函数返回值的占位符。

2

static

static变量只初始化一次,除此之外它还有可见性的属性:

1. static修饰函数内的“局部”变量时,表明它不需要在进入或离开函数时创建或销毁。且仅在函数内可见。

2. static修饰全局变量时,表明该变量仅在当前(声明它的)文件内可见。

3. static修饰类的成员变量时,则该变量被该类的所有实例共享。

3

register

寄存器变量。该变量存储在CPU寄存器中,而不是RAM(栈或堆)中。该变量的最大尺寸等于寄存器的大小。由于是存储于寄存器中,因此不能对该变量进行取地址操作。

4

extern

引用一个全局变量。当在一个文件中定义了一个全局变量时,就可以在其它文件中使用extern来声明并引用该变量。

5

mutable

仅适用于类成员变量。以mutable修饰的成员变量可以在const成员函数中修改。参见上一章chan.simple.h中对mutex的使用。

6

thread_local

线程周期

thread_local修饰的变量具有如下特性:

变量在线程创建时生成(不同编译器实现略有差异,但在线程内变量第一次使用前必然已构造完毕)。

线程结束时被销毁(析构,利用析构特性,thread_local变量可以感知线程销毁事件)。

每个线程都拥有其自己的变量副本。

thread_local可以和static或extern联合使用,这将会影响变量的链接属性。

下面代码演示了thread_local变量在线程中的生命周期

// thread_local.cpp

#include #include class A {

public:

A() {

std::cout << std::this_thread::get_id()

<< " " << __FUNCTION__

<< "(" << (void *)this << ")"

<< std::endl;

}

~A() {

std::cout << std::this_thread::get_id()

<< " " << __FUNCTION__

<< "(" << (void *)this << ")"

<< std::endl;

}

// 线程中,第一次使用前初始化

void doSth() {

}

};

thread_local A a;

int main() {

a.doSth();

std::thread t([]() {

std::cout << "Thread: "

<< std::this_thread::get_id()

<< " entered" << std::endl;

a.doSth();

});

t.join();

return 0;

}

运行该程序

$> g++ -std=c++11 -o debug/tls.out ./thread_local.cpp

$> ./debug/tls.out

01 A(0xc00720)

Thread: 02 entered

02 A(0xc02ee0)

02 ~A(0xc02ee0)

01 ~A(0xc00720)

$>

变量a在main线程和t线程中分别保留了一份副本,以下时序图表明了两份副本的生命周期。

c6818a7f00531fc69e7e155acd91caa6.png

上一篇

C++11多线程-异步运行

目录

下一篇

C++11多线程-原子操作(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值