問題タブ [thread-local-storage]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
1284 参照

c# - スレッドローカルストレージを使用したメモリリーク?

数日後、私たちの Web サイトは明らかにメモリ リーク (> 2Gb /pool) に悩まされています。それで、私はwindbgでいくつかのコマンドを実行し、最終的に何かを見つけました.たくさんありSystem.LocalDataStoreElementます. ソース コード (以下を参照) をすばやく検索したところ、非常に奇妙なクラスが見つかりました。

だから、私の質問:

  • ここで Thread.AllocateDataSlot を使用することは明らかに役に立ちませんが、メモリ リークを説明できますか? 完全な負荷テスト (400,000 リクエスト以上) の後では、リークを再現できないためです。
  • Web アプリケーションに TLS/ThreaStatic を使用することは適切ですか? asp.net では、スレッドの寿命を制御できず、ワーカー スレッドが多くの要求を実行するためです。

MS KB hereにも問題が見つかりました。

結論として、すべてがこのコードにあるようですが、問題を再現できませんでした。

0 投票する
3 に答える
2546 参照

c++ - Windows のスレッド ローカル ストレージは値を初期化しますか?

スレッド ローカル ストレージの初期値に関して、MSDN で矛盾を見つけました。 このページには次のように書かれています。

スレッドが作成されると、システムは TLS に LPVOID 値の配列を割り当てます。これらは NULL に初期化されます。

これにより、同じインデックスに対して TlsSetValue を呼び出したことのないスレッドから有効なインデックスを使用して TlsGetValue を呼び出すと、null ポインターを取得する必要があると考えるようになります。

ただし、このページには次のように記載されています。

スレッドが TlsGetValue を呼び出す前に TlsSetValue を呼び出すことを確認するのは、プログラマの責任です。

これは、TlsSetValue で明示的に初期化されていることが確実でない限り、TlsGetValue から返された値に依存できないことを示唆しています。

しかし、2 番目のページでは、次のようにも言って、null への初期化の動作を同時に強化しています。

TLS スロットに格納されたデータは、まだ初期値を持っているか、スレッドが TlsSetValue 関数を 0 で呼び出したため、値が 0 になることがあります。

したがって、データが null (または 0) に初期化されるという 2 つのステートメントと、値を読み取る前に明示的に初期化する必要があるという 1 つのステートメントがあります。実験的には、値は自動的に null ポインターに初期化されるように見えますが、運が良かっただけなのか、常にそうなのかどうかを知る方法はありません。

DLL_THREAD_ATTACH に割り当てるためだけに DLL を使用しないようにしています。次の行に沿って遅延割り当てを行いたいです。

これは信頼できる安全なパターンですか?または、スロットを読み取ろうとする前に、各スレッドのスロットを明示的に初期化する必要がありますか?

更新:ドキュメントには、TlsAlloc が割り当てられた index のスロットをゼロにすることも記載されています。そのため、スロットが以前にプログラムの別の部分で使用されていたかどうかは関係ないようです。

0 投票する
1 に答える
2856 参照

java - tomcatのThreadLocalLeakPreventionListenerは正確に何をしますか?

のドキュメントはorg.apache.catalina.core.ThreadLocalLeakPreventionListener言う

スレッドローカル関連のメモリリークを回避するために、が停止しているLifecycleListenerときにエグゼキュータプール内のスレッドの更新をトリガーするA。Context

ThreadLocalメモリリークを正確に防ぐにはどうすればよいですか?コンテキストが停止したときに、ThreadLocalのメソッドを明示的に呼び出しますか?remove()

私の知る限りThreadLocal、ハッシュマップとして実装されています。マップキーは、ThreadLocalインスタンス自体への参照です。マップ値はスレッドローカル値です。

0 投票する
1 に答える
1006 参照

c++ - スレッド ローカル ポインターの初期化

以下にリンクされている Niklas Frykholm による非常に素晴らしいブログ投稿を読んでいるときに、私は頭を包み込むことができない何かに出くわしました。

http://bitsquid.blogspot.nl/2012/01/sensible-error-handling-part-1.html

このコードは私を混乱させました:

コードは、単純なスタックとして使用される文字列の配列へのスレッド ローカル ポインターを定義します。私がよく理解していないのは、クロスプラットフォームの方法で配列を初期化して破棄する方法です? また、これは dll 境界でどのように機能しますか?

0 投票する
1 に答える
2536 参照

c# - Thread Local Storage / HttpContext Current Items へのデータの保存

Thread-Local Storage と のどちらにデータを格納するのHttpContext.Current.Itemsが効率的ですか?
これは、マスター データ/パラメーターを Web アプリケーションに保存するためのものです。
両方の方法でデータを配置するためのコードは次のとおり

です。 1. System.Web.HttpContext.Current.Items

2.TLS


ありがとう....

0 投票する
1 に答える
1113 参照

singleton - Pthread Thread-Local-Singleton、いつ TLS キーを解放しますか?

pthread TLS を使用して一種の「スレッド ローカル シングルトン」を実装しましたが、この場合、どのように (そしていつ) pthread_key_t を削除できるか疑問に思いました。現在のように、TLS キーによって使用されるメモリは決して解放されないからです。 d.

これの使用目的は、A がプライベート コンストラクターのみを持ち、ThreadLocalSingleton<A> が A のフレンドであると仮定して、A をスレッド ローカル シングルトンにする ThreadLocalSingleton<A> からクラス A を派生させることです。

ああ、また、その実装に問題はありますか。重要なことを見落としていませんか?

0 投票する
1 に答える
1534 参照

spring - セッション タイムアウト時の ThreadLocal の動作

私はJavaベースのWebアプリに取り組んでおり、現在ログインしているユーザーを追跡するためにThreadLocalを使用しています。これで、通常は問題なく動作します。ただし、セッション タイムアウトが発生し、システムが (ThreadLocal データから) 変数にアクセスしようとすると、ランダムな値 (他のログイン ユーザーの値) が返されます。理想的には、null 値を返す必要があります。ここで何が起こっているのか混乱しています。

0 投票する
2 に答える
2245 参照

c++11 - thread_local を使用すると、gcc 4.8.1 でメモリ リークが発生しますか?

Valgrind は、次のコードでリークされたブロックを報告しています。明らかに、スレッドごとに 1 つです。

コンパイラのバージョン:

GCC ビルド オプション:

プログラムのコンパイル オプション:

valgrind バージョン:

Valgrind オプション:

valgrind 出力の末尾:

コンストラクタとデストラクタは、スレッドごとに 1 回実行されました。

ノート:

  • 作成されるスレッドの数を変更すると、リークしたブロックの数はスレッドの数と一致します。
  • コードは、GCC がそのように実装されている場合、リソースの再利用 (つまり、リークされたブロック) を許可するような方法で構造化されています。
  • valgrind スタックトレースから、thread_local.cc:34 は次の行です。thread_local Foo foo;
  • sleep_for() 呼び出しのため、プログラムの実行には約 10 秒ほどかかります。

このメモリ リークが GCC にあるのか、設定オプションの結果なのか、それともプログラムのバグなのか、考えはありますか?