在 DLL 内部使用线程局部存储变量

问题描述 投票:0回答:1

我正在开发一个项目,需要在 DLL 中使用线程本地存储 (TLS) 变量,但我打算将这些符号导出到 DLL 之外。

据我所知,thread_local 变量不能导出到 DLL,至少在 MSVC 中不能。我的问题是在 DLL 内部使用线程局部存储变量而不将它们导出为符号是否可行且安全。

c++ dll shared-libraries c++20 thread-local-storage
1个回答
0
投票

如果 DLL 使用加载时绑定(即链接到 .lib 存根),则可以在 DLL 中使用线程局部变量。这与变量是否导出无关。但是,如果 DLL 是通过 LoadLibrary 加载的,那么您必须使用 TLS API(TLSAlloc 等),至少只要使用这些线程局部变量的任何库函数都将在调用时已存在的线程上调用。负载。

这是因为每个线程的 TLS 变量区域是在创建线程时分配的,并且如果加载新的 DLL,则该区域不会增长以满足新 DLL 的需求。

© www.soinside.com 2019 - 2024. All rights reserved.