【发布时间】:2021-06-10 22:24:31
【问题描述】:
cppreference 在thread_local 变量上声明以下内容
对象的存储在线程开始时分配,在线程结束时释放。每个线程都有自己的对象实例。只有声明为 thread_local 的对象才有此存储期限。
我想使用在共享库中声明的thread_local static 成员变量,该共享库在运行时通过dlopen / LoadLibrary 加载。由于完全有可能在加载该库的时间点已经有相当多的线程在运行,其中一些线程稍后将访问该变量,我想知道如果在线程开始时分配存储空间,这是如何工作的?如果在创建线程的时间点程序中不存在变量,这显然不能像那里解释的那样工作。此外,如果一个进程正在运行,这似乎是一种资源浪费。 100 个线程将为每个线程创建该线程局部变量的实例,前提是只有少数线程实际访问该变量。
那么,这里的文档是不正确的,还是我在这里尝试的可能会导致未定义的行为?如果文档完全不正确,我在哪里可以找到关于现实中可以预期的可靠描述?如果它是定义的实现,我特别感兴趣的是 clang 如何在 macOS 和 Windows 上处理它。
【问题讨论】:
标签: c++ dynamic-loading thread-local-storage