3

スレッド ローカル ストレージ変数のかなりの数 (質問しないでください!) を使用するアプリケーションがあります。ほぼ 10 年間、問題なく動作していましたが、最近驚きました。

顧客は Windows7 (64 ビット) を実行しているラップトップを使用しています... 彼のシステムでは、TLS 割り当てが失敗します。(私の問題は正確にはこれではありませんが、十分に近いです)。彼は、自分のシステムはかなり標準的だと主張しています。彼は ZoneAlarm を持っていますが、それ以外はすべて在庫があると主張しています。それを一粒の塩で取ってください)。誰が、または何が他の TLS スロットを割り当てているか (およびスロットを効果的に使い果たしているか) を調べるにはどうすればよいですか?

このアプリケーションは、コンソール スタンドアロン アプリケーションであり、ごく普通のアプリケーションです。ファイルのオープン/読み取り/書き込み、いくつかのマルチスレッド、実質的に他に何もないため、基本的な Windows DLL のみが積極的に関与することを期待しています。一部の DLL (Windows の DLL も含む) はスレッドベースのアクティビティを提供する可能性があるため、独自の 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 要求はより高いようです。しかし、2 つの Windows 7 システムの大きな違いの原因は一体何なのでしょうか? 特に以前のバージョンの Windows では必要がなかったことを考えると、アプリケーションの実行を開始するに TLS 変数 (おそらく DLL がスレッド状態を格納するため) が必要なのはなぜですか?

それが役立つ場合は、32 ビット アプリケーションを実行しています。

4

0 に答える 0