何时以及如何初始化和销毁thread_local变量?

When and how are thread_local variables initialized and destroyed?

本文关键字:thread local 变量 初始化 何时      更新时间:2023-10-16

我想在代码中使用它之前更好地理解thread_local

比方说,我声明

thread_local myclass value;

这将为使用该value的每个线程创建新的myclass实例?线程退出时会发生什么?实例是被释放还是会保留在内存中的某个位置?什么时候会被称为析构函数?

thread_local是否锁定构造函数,以便随时只能调用一个构造函数?

[basic.stc.thread]/1使用thread_local关键字声明的所有变量都具有线程存储持续时间。这些实体的存储应在创建它们的线程期间持续。每个线程都有一个不同的对象或引用,声明名称的使用是指与当前线程关联的实体。

[basic.stc.thread]/2具有线程存储持续时间的变量应在第一次使用 odr-use (6.2( 之前初始化,如果构造,则应在线程退出时销毁。

否,构造函数调用没有自动同步。不需要,因为只有一个线程可以尝试构造给定的线程本地对象。

根据此存储持续时间,引用一个thread_local变量:

。在线程开始时分配,在线程结束时解除分配。

所以是的,当线程结束时,该线程的thread_local变量的生命周期也会结束,这意味着这些特定实例将被破坏。