C++ 在动态加载的库中执行本地静态变量–;它们是什么时候创建的?

C++ 在动态加载的库中执行本地静态变量–;它们是什么时候创建的?,c++,dynamic-loading,thread-local-storage,C++,Dynamic Loading,Thread Local Storage,在thread\u local变量上声明以下内容 对象的存储在线程开始时分配,在线程结束时解除分配。每个线程都有自己的对象实例。只有声明为thread_local的对象具有此存储持续时间 我考虑使用共享库中声明的thread\u local static成员变量,该变量在运行时通过dlopen/LoadLibrary加载。由于完全有可能在加载此库的时间点已经有相当多的线程在运行,其中一些线程稍后将访问该变量,因此我想知道如果在线程开始时分配了存储,这是如何工作的?如果该变量在创建线程的时间点不存

thread\u local
变量上声明以下内容

对象的存储在线程开始时分配,在线程结束时解除分配。每个线程都有自己的对象实例。只有声明为thread_local的对象具有此存储持续时间

我考虑使用共享库中声明的
thread\u local static
成员变量,该变量在运行时通过
dlopen
/
LoadLibrary
加载。由于完全有可能在加载此库的时间点已经有相当多的线程在运行,其中一些线程稍后将访问该变量,因此我想知道如果在线程开始时分配了存储,这是如何工作的?如果该变量在创建线程的时间点不存在于程序中,则显然无法按照此处的说明工作。此外,如果一个进程运行(例如100个线程)会为每个线程创建一个线程局部变量的实例,而实际上只有少数线程会访问该变量,这似乎是在浪费资源


那么,这里的文档是否不正确,或者我在这里尝试的内容是否有可能导致未定义的行为?如果文档仅仅是不正确的,我在哪里可以找到对实际情况的可靠描述?如果它是实现定义的,我特别感兴趣的是clang如何在macOS和Windows上处理它。

cppreference所说的话被解释了。实际上是

使用
thread\u local
关键字声明的所有变量都具有线程存储持续时间。这些东西的储藏室 实体在创建它们的线程期间持续。存在一个不同的对象或引用 每个线程,并且声明名称的使用引用与当前线程关联的实体

这里并没有关于存储分配的确切时间,只是它在线程的持续时间内持续。这意味着它可以在创建线程时分配,或者在第一次使用变量时分配,或者可能是两者的组合

分配存储时,可能无法构造变量(我假设这就是您所说的“创建实例”的意思)。这取决于变量定义的位置和方式。但是,如果它被构造,它将不会被破坏,直到线程结束

通过
dlopen
LoadLibrary
动态加载库的支持是编译器/平台扩展,而不是语言的一部分。它与本地线程的交互方式也是平台特定的。