Thread Local存储

Thread Local存储

什么是Thread Local

     C++11中的Thread Local称为线程局部变量,也称为线程局部存储 。

    核心思想:Thread Local在每个变量中都会创建一个副本,在多线程环境下,每个线程访问自己内部的副本变量,而这些副本相当于局部变量,只有线程自己能看见,对其修改也不会影响其他线程,既保证了线程安全,又避免了锁操作。

与锁有什么区别

    锁是同一时间最多只有一个线程执行,变量只需要一份,是时间换空间的思想

    Thread Local是多个线程互不影响,所以每个线程存一份变量,是空间换时间的思想

如何使用Thread Local

在声明变量时,只要加入关键字thread_local 标记,它即成为线程局部变量。只有三种数据能声明为线程局部变量:1、以名字空间为作用域的变量 ,2、类的静态数据成员,3、普通的局部变量

/*以名字空间为作用域*/
thread_local int x;
/*类的静态数据成员*/
class X
{
	static thread_local std::string s;
};
/*普通的局部变量*/
void foo
{
	thread_local std::vector<int> v;
}

简单测试
特点:Thread Local 变量只会在每个线程最开始被调用的时候进行初始化

#include <iostream>
#include <mutex>
#include <thread>
std::mutex cout_mutex;    //方便多线程打印

void thread_func(const std::string& thread_name) {
    for (int i = 0; i < 3; ++i) {
        thread_local  int x = 1;  //只在每个线程创建时初始化一次
        x++;
        std::lock_guard<std::mutex> lock(cout_mutex);
        std::cout << "thread[" << thread_name << "]: x = " << x << std::endl;
    }
}

int main() {
    std::thread t1(thread_func, "t1");
    std::thread t2(thread_func, "t2");
    t1.join();
    t2.join();
    return 0;
}

输出:

thread[t1]: x = 2
thread[t1]: x = 3
thread[t1]: x = 4
thread[t2]: x = 2
thread[t2]: x = 3
thread[t2]: x = 4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值