thread_local
是 C++11 引入的关键字,用于声明线程局部存储变量。这意味着每个线程都有其自己的变量实例,每个线程都可以独立地访问和修改该变量,而不会影响其他线程的同名变量。
适用 thread_local
的场景通常涉及到需要在每个线程中保持状态的情况,同时又不希望这些状态被其他线程共享。以下是一些适合使用 thread_local
的场景:
线程安全的单例模式:
thread_local
变量可以用于实现线程安全的单例模式。每个线程都有自己的单例实例,不需要额外的同步机制来保护共享状态。线程特定的配置:有时候,不同的线程可能需要不同的配置参数。使用
thread_local
变量可以让每个线程拥有自己的配置,而不会相互干扰。线程局部缓存(Thread Local Storage Cache):在多线程环境中,频繁地访问全局变量可能会导致性能下降。
thread_local
变量可以用作线程局部缓存,以提高访问速度。线程特定的日志:在多线程应用程序中进行日志记录时,使用
thread_local
变量可以轻松地跟踪每个线程的日志信息,而无需在日志记录期间进行同步。线程状态传递:有时需要在线程之间传递状态信息,但又不想使用线程参数传递或全局变量。
thread_local
变量提供了一种简单的方法,在不同的函数调用之间保持线程特定的状态。
需要注意的是,thread_local
变量的生命周期与线程的生命周期相对应。它们在每个线程中首次访问时初始化,在线程退出时销毁。因此,在使用 thread_local
变量时,必须确保线程退出时的资源释放工作。
注:例:static thread_local s_var
;即使是静态变量,thread_local
关键字也会使其在每个线程中都有自己的实例。所以,每个线程中的 s_var
变量都会在该线程首次访问时被初始化一次。每个线程都有自己独立的 s_var
实例,而且它们之间互不影响。