- C++线程储存持续性(C++11)
关键字 thread_local,其生命周期与所属的线程一样长。
thread_specific_ptr代表了一个全局的变量,而在每个线程中都各自new一个线程本地的对象交给它进行管理,这样,各个线程就可以各自独立地访问这个全局变量的本地存储版本,线程之间就不会因为访问同一全局对象而引起资源竞争导致性能下降。而线程结束时,这个资源会被自动释放。
还有一种实现方式,比如我不把某一资源生命为静态变量,我在每个线程调用函数中声明局部变量,然后通过传参的方式来实现。不过这种明显复杂,只要将资源声明thread_local即可。
简单例子:
#include <iostream>
#include <string>
#include <mutex>
#include <thread>
std::mutex coutMutex;
thread_local std::string s("hello from ");
void addThreadLocal(std::string const& s2){
s+=s2;
std::lock_guard<std::mutex> guard(coutMutex);
std::cout << s << std::endl;
std::cout << "&s: " << &s << std::endl;
std::cout << std::endl;
}
int main(){
std::cout << std::endl;
std::thread t1(addThreadLocal,"t1");
std::thread t2(addThreadLocal,"t2");
std::thread t3(addThreadLocal,"t3");
std::thread t4(addThreadLocal,"t4");
t1.join();
t2.join();
t3.join();
t4.join();
}
|