在我使用 thread_local
之前,我希望更好地理解它。
假设我声明:
thread_local myclass value;
这将为每个使用value
的线程创建一个myclass
的新实例。当线程退出时会发生什么?实例会被释放还是将继续留在内存中?析构函数何时调用?
thread_local
是否锁定构造函数,以便只能在任何时刻调用一个构造函数?
在我使用 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
变量的生命周期也会结束,这意味着那些特定实例将被销毁。
random_device
来初始化您的伪随机数生成器:thread_local std::mt19937 prng(std::random_device{}());
- Ted Lyngmo