我有一个由许多 DLL 文件组成的游戏。其中一些 DLL 链接到同一个静态库 (LIB)。
所以是这样的:
Game.exe -> Root.dll -> Child.dll
| |
| '-> Common.lib (contains __declspec(thread))
|
'-> Common.lib (contains __declspec(thread))
Root.dll 加载静态链接 Common.lib 的 Child.dll。Root 也静态链接 Common.lib。因为 Common 是静态链接的,所以它直接编译到加载的 dll 中(例如 Root 和 Child)。
Common.lib 包含一个使用线程本地存储 (TLS) 的变量。
__declspec(thread) static void* s_threadValues[PlatformThreadSlotsMax];
这会导致一些有问题的行为:Root.dll 和 Child.dll 各自包含不同的 TLS 数据实例 (s_threadValues)。即使在同一个线程上,如果 Root.dll 调用 Common.lib 中定义的函数,则 s_threadValues 的值将与从 Child.dll 调用相同函数的值不同。
由于两个 DLL 都从同一个线程访问这个 TLS,我希望 TLS 是共享的,但事实并非如此。
现在,如果我将 Common.lib 更改为动态链接(例如 Common.dll),则不会再出现此问题: Root.dll 和 Child.dll 的 s_threadValues 相同。
这是预期的行为吗?无论如何在使用它的动态库之间共享静态库中定义的 TLS 共享?