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