C++11新增的关键字thread_local,表示对象的生命周期属于线程存储期。
如果类的成员函数内定义了 thread_local 变量,则对于同一个线程内的该类的多个对象都会共享一个变量实例,并且只会在第一次执行这个成员函数时初始化这个变量实例。
thread_local 一般用于需要保证线程安全的函数中。
使用场景:
随机数生成,每个线程维护不同的种子。
线程池,观察每个线程的负载情况。
本质上,就是线程域的全局静态变量。
#include <iostream> #include <string> #include <thread> #include <mutex> thread_local unsigned int rage = 1; std::mutex cout_mutex; void increase_rage(const std::string& thread_name){ ++rage; // modifying outside a lock is okay; this is a thread-local variable std::lock_guard<std::mutex> lock(cout_mutex); std::cout << "Rage counter for " << thread_name << ": " << rage << '\n'; } int main(){ std::thread a(increase_rage, "a"), b(increase_rage, "b"); { std::lock_guard<std::mutex> lock(cout_mutex); std::cout << "Rage counter for main: " << rage << '\n'; } a.join(); b.join(); }
可以看出,主线程、线程a、线程b对变量rage的访问都是独立的。