3

我有一个使用相当数量(不要问!)的线程本地存储变量的应用程序。近十年来,它一直可以毫无问题地运行……直到最近出现了一个惊喜。

客户有一台运行 Windows7(64 位)的笔记本电脑......在他的系统上,TLS 分配失败。(我的问题不完全是这个,但足够接近)。他声称他的系统非常标准。他有一个 ZoneAlarm,但声称其他一切都是库存;把它和一粒盐一起吃)。我如何找出谁或什么在分配其他 TLS 插槽(并有效地让我用尽插槽)?

该应用程序是一个控制台独立应用程序并且相当普通:打开/读/写文件,一些多线程,几乎没有其他任何东西,所以我希望只有基本的 Windows DLL 被积极参与。我知道一些 DLL(甚至是 Windows 的)可能会为基于线程的活动提供服务,因此会分配自己的 TLS 插槽,这没关系。但我不希望任何理智的人分配很多很多。作为我的应用程序启动的一部分(可能是防火墙),是否有其他东西可以将自己插入我的进程空间?

一个典型的进程在启动时应该分配多少个 TLS 插槽?需求从何而来?我可以跟踪 TLS 调用以查看谁在以某种方式分配它们吗?

编辑:2013 年 1 月 1 日: 现在有了一些经验,并让我的工具在启动时报告 TLS 需求,我看到如下内容:

  • Win XP 64 8 核 16 Gb RAM:3 个 TLS 变量繁忙
  • Windows Vista 32 4 Gb RAM:4 个 TLS 变量繁忙
  • Win 7 Pro:4 核 8 Gb RAM:7 TLS 变量繁忙
  • Win 7(法语版):2 核,4 GB:最少 25 个 TLS 变量繁忙,在某些配置中更多

我们正在检查 Windows 8,但它的 TLS 需求似乎更高。但究竟是什么导致了两个 Windows 7 系统之间的巨大差异?为什么在我的应用程序开始运行之前需要 TLS 变量(可能是 DLL 存储线程状态) ,特别是考虑到早期版本的 Windows 中不需要?

如果有帮助,我们正在运行一个 32 位应用程序。

4

0 回答 0