問題タブ [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.
multithreading - ローカル変数の代わりにスレッド ローカル ストレージ (TlsAlloc、TlsGetValue、ets) を使用する理由
私の質問は、スレッド関数でローカル変数だけでなく、TLS メカニズムを使用する理由です。良い例をいくつか教えてください。または、ローカル変数に対する TLS の利点は何ですか? ありがとう、マテウス
c# - スレッドのローカル ストレージのメモリ使用量
.NET で、スレッド ローカル ストレージが使用しているメモリの量を判断する方法はありますか?
具体的には、ThreadStatic オブジェクトによって使用されるメモリの量と、Thread データ スロット内のオブジェクトに割り当てられたメモリ (たとえば、Thread.SetData を呼び出すことによって) によって使用されるメモリの量を見つけようとしています。
明確にするために:
スレッド ローカル ストレージ: http://msdn.microsoft.com/en-us/library/6sby1byh.aspx
スレッド ローカル ストレージ: スレッド相対静的フィールドとデータ スロット http://msdn.microsoft.com/en-us/library/6sby1byh.aspx
c++ - スレッド-ローカルストレージとiOS
私の理解では、iOSはをサポートしていません__thread
。明らかに、を使用してこれを行う方法がありますpthread_setspecific
。ただし、この機能を実装したテンプレートクラスはすでにありますか?
特に、書くのが簡単なコードではないので、車輪の再発明をしたいと思います。
リンクをいただければ幸いです。
乾杯
java - ThreadLocalJDKのドキュメント
JDK 1.6のドキュメントには、の使用方法に関する例が示されていますLocalThread<T>
。ここにコピーして貼り付けます:
たとえば、以下のクラスは、各スレッドにローカルな一意の識別子を生成します。スレッドのIDは、最初に呼び出されたときに割り当てられ、UniqueThreadIdGenerator.getCurrentThreadId()
その後の呼び出しでは変更されません。
私の問題は:
複数のスレッドが呼び出すUniqueThreadIdGenerator.getCurrentThreadId()
場合、初期化がないため、0のみが返されます。このようにすべきではありません:
最初の呼び出しの後、変数を初期化します。
.net - TPL の使用時にスレッド ローカル ストレージ (TLS) を管理するにはどうすればよいですか?
ロギング コンテキスト情報を TLS に保存して、エントリ ポイントで値を設定し、その値を結果のすべてのスタックで使用できるようにしたいと考えています。これはうまくいきますが、TPL と ThreadPool も使用しています。問題は、TLS データを他のスレッドに移行する方法です。私はすべて自分で行うことができますが、Parallel.For のような便利なメソッドが失われます。
TPL を使用するときに TLS をコピーする方法はありますか? これは、await 機能を取得するときに C# にも適用されます。
ありがとう、エリック
python - Python プログラムで ctypes を介してスレッド ローカル ストレージで共有ライブラリを使用するとメモリ リークが発生する
Python でモジュールを使用して、ctypes
スレッド ローカル ストレージを含む共有 c-library をロードしています。これは長い歴史を持つ非常に大きな c-library であり、スレッドセーフにしようとしています。ライブラリには多くのグローバル変数と静的変数が含まれているため、スレッド セーフに対する最初の戦略は、スレッド ローカル ストレージを使用することでした。ライブラリをプラットフォームに依存しないようにしたいと考えており、win32、win64、および 64 ビット Ubuntu の両方でスレッド セーフをコンパイルおよびテストしています。純粋な c プロセスからは、問題はないようです。
ただし、win32 および Ubuntu の Python (2.6 および 2.7) では、メモリ リークが発生しています。Python スレッドが終了したときに、スレッド ローカル ストレージが適切に解放されていないようです。または、少なくとも、メモリが解放されたことをpythonプロセスが「認識」していないということです。同じ問題は、実際には win32 の ac#-program でも見られますが、win64 サーバー テスト マシン (python 2.7 も実行) には存在しません。
この問題は、次のような単純なおもちゃの例で再現できます。
以下を含む c ファイルを作成します (linux/unix
削除__declspec(dllexport)
時):
MINGW
次のように、Linux の Windows/gcc でウィットをコンパイルします。
gcc -o leaky.dll
(またはleaky.so
)-shared the_file.c
Windows では、Visual Studio でコンパイルして__thread
、__declspec(thread)
. ただし、win32 (winXP までだと思います) では、ライブラリを実行時に .xml でロードする場合、これは機能しませんLoadLibrary
。
次のような python プログラムを作成します。
エラーを再現するにはこれで十分です。ガベージ コレクターを明示的にインポートしcollect gc.collect()
ます。新しいスレッドを開始するたびに a を実行しても効果はありません。
しばらくの間、この問題は互換性のないランタイム (Visual Studio でコンパイルされた Python、私のライブラリではMINGW
) に関係していると考えていました。しかし、問題はUbuntuにもありますが、ライブラリがMINGW
.
誰でも助けてくれることを願っています!
乾杯、Simon Kokkendorff、National Survey and Cadastre of Denmark。
visual-c++ - __addgs *はどのように使用され、GSとは何ですか?
Microsoftのサイトで、
組み込み関数。それはであると述べられていoffset
ます
GSの先頭からのオフセット。GSはプロセッサレジスタを参照していると思います。
GSは、スタックとどのように関連していますか?または、 GSに関するオフセットを計算するにはどうすればよいですか?
(そして、これや特定の呼び出し規約に関連する「落とし穴」はあります__fastcall
か?)
c++ - thread_localのコスト
C ++がthread_local
言語機能としてストレージを追加しているので、いくつか疑問に思っています。
thead_local
ありそうな 費用はいくらですか?- メモリ内ですか?
- 読み取りおよび書き込み操作の場合?
- これに関連して:オペレーティングシステムは通常どのようにこれを実装しますか?宣言されたものは
thread_local
すべて、作成されたスレッドごとにスレッド固有のストレージスペースを指定する必要があるように思われます。
c# - 既知のシードを使用してThreadLocalランダムジェネレーターを作成する
スレッドごとに単一の乱数ジェネレーターを作成する方法を見つけるのに苦労していますが、同時に、プログラムを再実行したときに同じ番号が生成されるようにしています。
私が今していることは次のようなものです:
'data'リストを作成するrandomgeneratorにはシードが提供され、計算に使用されるrandomgeneratorには処理中の数値のハッシュコードに基づいたシードが提供されるため、結果は再現可能です。スレッドの数とインスタンス化される順序に関係なく。
スレッドごとに1つのrandomgeneratorだけをインスタンス化できるかどうか疑問に思っています。次のコードはそれを実現しているようですが、ランダムジェネレーターには(再現可能な)シードが提供されていないため、結果を再現することはできません。
誰かがこの問題の良い解決策を考えることができますか?
linux - アセンブリの%gsとは
gccでコンパイルした後、この関数は次のアセンブリコードに変換されます。
私は2行を理解していません:
%gsとは何ですか、そしてこれらの2行は正確に何をしますか?
これはコンパイルコマンドです: