問題タブ [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 に答える
810 参照

windows - Windows: アプリケーションが読み込まれる前に TlsAlloc を呼び出しているのは誰ですか?

スレッド ローカル ストレージ変数のかなりの数 (質問しないでください!) を使用するアプリケーションがあります。ほぼ 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 ビット アプリケーションを実行しています。

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

c++ - TLS を使用するとキャッシュ ミスが少なくなりますか?

マルチスレッド プログラムでスレッド ローカル ストレージを使用すると、キャッシュ ミスが少なくなりますか?

編集:各スレッドには独自のメモリプールが与えられているため、最後にアクセスしたメモリがまだCPUキャッシュにある可能性が高くなりますか?

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

java - Tomcat サーブレットの ThreadLocal

実稼働システムで例外がポップアップするという問題がありますが、誰が例外を引き起こしているのかについての良い情報がありません。個人のユーザー名は tomcat セッションに変数として格納されており、明らかにdoPostordoGetメソッドでアクセスできますが、その情報を各ビジネス オブジェクトにパラメーターとして渡さない限り、セッションにアクセスすることはできません。 . 明らかな理由から、ログ メッセージにユーザー名を追加して、何が起こっているのかを把握したいと思います。

だから私の解決策は、このようなことをすることです

次に、投稿/取得で、これを行うことができます

次に、私の例外では、これを行う可能性があります(不自然な、悪い習慣の例)

私が懸念している唯一の問題は、Tomcat が私のスレッドをどのように管理するかということです。彼らがスレッドを保持するとどうなりますか?彼らは持続しますか?ThreadLocal 値も保持されますか? String だけでなく ThreadLocal に Session 全体を格納していた場合、重大なメモリ リークが発生する可能性があります。また、誰かが複数のリクエストに対して永続化されたスレッドのユーザー名/セッションを再設定するのを忘れた (または完了時にクリアするのを忘れた) 場合、そこに古いデータが存在する可能性があることも意味します。

私の皮肉を呼んでください、しかし私はプログラムの正確さのために何かをすることを忘れないでプログラマーに頼る必要はありません (特に私自身!)。自分のコードをばか証明できるなら、そうしたいです。これは、Tomcat がスレッドをどのように使用するかをよりよく理解することを意味します。

したがって、一文形式の質問は次のとおりです。

Tomcat (7.0.27) で実行されている webapp で ThreadLocal を使用すると、Thread が複数の要求に使用され、以前の要求からのデータが永続化されるリスクがありますか?

「Tomcat/ThreadLocal のシェナニガン」の正確な質問には答えていませんが、ロギング目的でセッション変数にエレガントにアクセスできる代替ソリューションを受け入れることに注意してください。また、私のソリューションの潜在的な落とし穴についてのコメントも受け付けています。解決しなければならないビジネス上の問題がありますが、解決策は 1 つではありません。私の製品システムで誰が例外を引き起こし続けているのか知りたいだけです:)

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

c++ - C ++ 11のthread_localはどういう意味ですか?

thread_localC++11での説明と混同しています。私の理解では、各スレッドには関数内のローカル変数の一意のコピーがあります。グローバル/静的変数には、すべてのスレッドからアクセスできます(ロックを使用した同期アクセスの可能性があります)。そして、thread_local変数はすべてのスレッドに表示されますが、変数が定義されているスレッドによってのみ変更できますか?それが正しいか?

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

c++ - C ++ 11:重要なスレッドローカル静的変数?

私はクラスXを持っています:

私はこれをしたい:

(実際にはgccを使用しているので、キーワードは「__thread」です)

しかし、あなたは些細なthread_localsしか持てないので、私はできません。

これに対する最善の回避策は何ですか?

私がこのようにすると:

それから:

  1. スレッドが終了するときにデストラクタは呼び出されません
  2. 不要な動的メモリ割り当て。

アップデート:

これが私がこれまでに持っているものです:

これにより、動的メモリ割り当ての問題が修正されます。スレッドクリーンアップハンドラーを追加する必要があります。pthreadでこれを行うメカニズムはありますか?

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

c++ - C ++でスレッドローカル変数を初期化する方法は?

重複の可能性:
gccのC ++ 11 thread_local-代替案
GCCの__threadを使用してthread_localを完全にエミュレートする方法はありますか?

c ++ 11thread_localを使用してthread_local変数を作成して使用したかったのですが、gccでまだサポートされていないため、gcc固有のを使用しています__thread。私が変数を宣言した方法は

コンパイルすると、次のようなエラーが発生します

適切にそれを行う方法は?

PS:gccバージョン:4.6.3

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

c++ - ucontext とスレッド ローカル ストレージ

質問しているプラ​​ットフォームは Linux です。私が話しているスレッドローカルストレージはpthread_xxx、または__threadgccにあります。

プログラムで ucontext のもの、つまり makecontext、swapcontext などを使用したいと考えています。私の質問は、スレッドローカルストレージでどのように機能するのですか? 具体的には、swapcontext または setcontext を使用して別のファイバーに切り替えた場合、スレッド ローカル ストレージも変更されますか? それとも、スレッド ローカル ストレージはコンテキストの一部ではありませんか?

別の質問: TLS がsetcontext/によって変更される場合swapcontext、コンテキストをどのように変更しても、スレッドに固執するものはありますか? 一方、TLS がコンテキストに固執する場合、スレッドに固執し、setcontext/swapcontext によって変更されないものはありますか?

http://en.wikipedia.org/wiki/Fiber_(computer_science)によると、Windows プラットフォームにはスレッド ローカル ストレージとファイバー ローカル ストレージがあります。

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

spring-webflow-2 - requestcontextholder 同時アクセス

weblogicサーバーで実行されているSpring Webflowアプリケーションで以下のコードを使用しています。

RequestContextHolder.getRequestContext() .getExternalContext().getNativeRequest()).getSession()

開始中および再開中のステップを保存するためにRequestContextHolder使用することを知っています。ThreadLocalrequestContext

ここで、あるスレッドが他のスレッドにアクセスする可能性がリモートである可能性はありますかrequestContext(スレッドが weblogic によって再利用されているか、他の理由である可能性があります)。

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

c - 各 CPU arch の実際の ELF TLS ABI 要件は何ですか?

スレッド ローカル ストレージに関するUlrich Drepper の論文では、いくつかの異なる CPU アーキテクチャの TLS ABI の概要が説明されていますが、次の 2 つの理由から、TLS を実装するための基礎としては不十分であることがわかりました。

  1. ARM、MIPS などの多くの重要なアーキテクチャが省略されています (一方で、Itanium のような完全に無関係なものが多数含まれています)。
  2. さらに重要なことは、多くの実装の詳細が ABI と混在しているため、相互運用性に必要なプロパティと、彼の実装の単なる側面を区別するのが難しいことです。

例として、i386 の実際の ABI 要件は次のとおりです。

  • %gs:0自分自身へのポインタを指します。
  • メイン実行可能ファイルの TLS セグメントがある場合は、このアドレスからの固定 (リンカーによる負の) オフセットに配置する必要があります。
  • 最初にロードされたライブラリの他のすべての TLS セグメントには、このアドレスに関連する実行時定数 (つまり、各スレッドで同じですが、異なるプログラム実行間で必ずしも同じであるとは限りません) のオフセットが必要です (また、動的リンカーは、再配置をこれらのオフセット)。
  • ___tls_get_addr__tls_get_addr関数は、任意の TLS セグメントを検索するための正しいセマンティクスで存在する必要があります。

特に、DTV の存在またはレイアウトは ABI の一部ではなく、メイン プログラム以外の TLS セグメントの順序付け/レイアウトでもありません。

「TLSバリアントII」を使用するアーキテクチャには、おおよそ上記のABI要件があるようです。しかし、「TLSバリアントI」の要件をまったくよく理解していません。ソース(uClibcおよびglibcの)を読むと、「バリアントI」にはいくつかのバリアントが存在する可能性があるようです。

私が見るべきより良いドキュメントはありますか、またはTLSの仕組みに詳しい人がABI要件を説明してくれますか?

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

linux - CPU ごとの変数のアドレス

x86-64 SMP で動作するバージョン 2.6.32 用の小さな Linux ロード可能カーネル モジュールを作成しています。

私の質問は次のとおりです。カーネルで宣言された CPU ごとの変数のアドレスのオフセットを取得する方法はありますか。オフセットとは、gs レジスタにある percpu ベースからのアドレスのオフセットを意味します。具体的には、現在のタスクのタスク構造体へのポインターである current_task 変数のオフセットを見つけようとしています。

get_current() 関数を持つ arch/x86/include/asm/current.h を見ています。この関数は、マクロ percpu_read_stable を使用して、CPU ごとの変数 current_task を読み取ります。私が理解できる限り、percpu_read_stable は基本的に次のような asm ルーチンに展開されます。

これは arch/x86/include/asm/percpu.h にあります。モジュールから gs の後のオフセットを読み取りたいです。per_cpu_current_task 変数を使用して簡単に printk を実行しようとすると、モジュールが強制終了されます。

ご清聴ありがとうございました!