問題タブ [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.
java - ThreadLocalsを使用するAkkaおよびJavaライブラリ
私が(Javaで)Akkaを定期的に使用することを妨げているのは、ThreadLocalsを使用するライブラリに関する懸念です。
つまり、一部のAkkaディスパッチャーは、ThreadLocal変数が取り残されたり、すべて一緒に欠落したりする可能性があると思います。したがって、明らかな解決策はThreadLocalsの使用を避けることですが、それらを使用するライブラリは非常に多くあります:Spring、Wro4j、Log4jなど...
ThreadLocalsは通常、サーブレットコンテナで正常に機能します。これは、コンテナにスレッドプールがある場合でも、リクエストは主に同期ライフサイクルであるため、通常、リクエストの最後に、SpringやWro4Jなどがスレッドローカルをクリーンアップします。Tomcatのような一部のコンテナは、スレッドローカルリークを監視します。
私が理解していることから、Akkaではそうではありません。
人々はこの問題をどのように回避しますか?
今のところ、Akkaの使用を避け、メッセージキュー(RabbitMQやActiveMQなど)を使用していますが、非同期の問題/解決策の範囲が広いため、Akkaを使用したいと思います。
Nettyにも同様の問題があると思いますが、Nettyは、ThreadLocalの代わりに使用できるある種のChannel Contextオブジェクトを提供していると思います。理論的には、一部のライブラリはThreadLocalの代わりにそれを使用することを知っているかもしれません。
c++ - boost::thread のスレッド固有のリソースを手動でクリーンアップする
ブースト スレッド スタティック ライブラリは、スレッド固有のデータをクリーンアップするためにスレッド ローカル ストレージ コールバックを使用するため、C++/CLI コードでは使用できません。ブースト ライブラリをビルドするときに tss_pe.obj を除外することで、これらのコールバックを無効にすることができます。これにより、マネージ コードでライブラリを使用できるようになりますが、これらのリソースを手動でクリーンアップする必要があります。
これは公式に文書化されていませんが、この手動クリーンアップに必要なさまざまなバグ/フォーラムの投稿 (例: https://svn.boost.org/trac/boost/ticket/1848 )からまとめました。
- 「boost::thread によって管理されていない」スレッドを終了するときに on_thread_exit() を呼び出します。これが何を意味するのか、Boost スレッドが管理していないスレッドのリソースをクリーンアップする責任を負う理由については、私にはよくわかりません。
- main の最初と最後で on_process_enter と on_process_exit を呼び出している可能性もあります ( http://lists.boost.org/Archives/boost/2007/11/130440.php )。
以前にスレッド ローカル ストレージを使用したことがないライブラリの新しいユーザーとして、これらの簡潔なガイドラインを完全に理解していることを確認したいと思います。マネージ クラスもいくつか含まれている COM DLL 内のアンマネージ コードからブースト スレッドを使用します。
自動クリーンアップが無効になっているときにリソースのリークを避けるために上記の関数を呼び出す必要がある正確な状況について、例を挙げてより詳細な説明を誰かが提供できますか?
java - dlopen: 静的 TLS でこれ以上オブジェクトを読み込めません
複数の共有ライブラリを Java にロードする大規模な混合 Java/C++ アプリケーションがあります。私の Ubuntu 12.04 32 ビット マシンでは問題なく動作しますが、Fedora 17 64 ビット マシンではうまく動作しません。すべてが正常にコンパイルされますが、実行しようとすると次のようになります。
どんな助けでも大歓迎です!
更新: これを PCL (点群ライブラリ) の依存関係の問題に絞り込みました。libmylib.so は PCL に依存しますが、インストールされていない場合は PCL なしでコンパイルすることもできます。PCL なしでコンパイルすると問題なく動作します。PCL コミュニティの人々からの返信を待っています。彼らの提案に基づいてこのスレッドを更新します。
servlets - ThreadLocalを使用してHttpServletRequestと応答を保存する
重複の可能性:
サーブレットにServletRequestとResponseを格納するためのThreadLocal:何のために?
後でいくつかのビジネスサービスメソッドを呼び出すいくつかのDelegatorクラスに情報を送信するサーブレットクラスがあります。
Delegatorクラスのメソッドに現在のHttpServletRequestオブジェクトとHttpServletResponseオブジェクトが必要です。メソッドシグネチャの一部として保持するのではなく、サーブレットクラスのThreadLocal変数に設定し、後でDelegatorクラスのメソッドのThreadLocal変数から取得することを考えました。
以下はサンプルコードです。
このアプローチで問題が発生する可能性があるかどうかを提案していただけますか?
c - Cの_Thread_localストレージクラス指定子?
私は本CHowto Program 7thで、次の名前の新しい標準Cストレージクラスに関するメモを読みました_Thread_local
。
新しいC標準では、ストレージクラス指定子が追加されています
_Thread_local
が、これはこの本の範囲を超えています。
Googleで探しましたが、ここには何も表示されません。誰かが私にそれについてのリンクを教えてもらえますか?
c++ - スレッドローカルとコンテキストスイッチ
スレッド ローカル ストレージを利用する C++ コードがいくつかあります。各スレッドには、データをプッシュできるベクトルがあります。
TLS を使用してスレッドごとにインデックス ID を保存します。これを使用して、データをプッシュするベクトルを検索できます。次に、データをベクターにプッシュするかなりの量のコードを実行します。
私が疑問に思っているのは、OS がスレッド ローカル オブジェクトへのポインターを取得した後、別のスレッドで実行するようにコードを再スケジュールする可能性があるかどうかです。(これまでのところ、コードは正常に実行されますが、これが発生したことはありません)。しかし、2 つのスレッドが同じオブジェクトを持つことが可能になるため、これが可能であるとすれば、私のプログラムが壊れることは間違いないようです。
これが真実であると仮定すると、複雑な TLS を使用するコードでも問題になるように思われますが、TLS はアドレスを取得しない単純なオブジェクトのみを対象としていますか?
ありがとう!
c - カスタム libc でのスレッドローカル ストレージの実装
私はlibc
非常に小規模で静的にリンクされたプログラム用に の小さなサブセットを実装していますが、TLS サポートを追加することは良い学習体験になると考えました。Ulrich Drepper の TLS ドキュメントを参照として使用します。
これを試すために、2 つの文字列を設定しました。
また、コンパイラはそれらにアクセスするために次の命令を生成します。
TCB をスタックのどこかに配置するとします。
そして、そのすぐ隣に TLS エリアを配置しますtls = &tcb - tls_size
。次に、FS レジスタが を指すように設定しfs = tls + tls_size
、TLS 初期化イメージを にコピーしますtls
。
ただし、これは機能しません。に 20 バイトを書き込むことで、TLS 初期化イメージを正しく見つけられることを確認しましtls_image
たstdout
。これにより、TCB および/または TLS 領域を間違って配置したか、そうでなければ ABI に準拠していないと信じるようになります。
- を使用して FS レジスタを設定し
arch_prctl(2)
ます。どういうわけか使用する必要がありますset_thread_area(2)
か? - 私は持っていません
dtv
。静的にリンクしているので、これは必要ないと思います。
私が間違っていることについてのアイデアはありますか?どうもありがとう!
c++ - WindowsでのTLSコールバックについて
これはテストコードです
マルチスレッドデバッグDLL(/ MDd)を使用してビルド実行結果:メインスレッドtls値= 1
マルチスレッドデバッグ(/ MTd)実行結果でビルド:メインスレッドtls値= 0
MTdの使用時に作成されたメインスレッドをキャプチャできないようです
なぜ ?
.net - TPL データ フロー スレッド ローカル データ
DataFlowExecutionOptions で MaxDegreeOfParallelization を > 1 に指定すると、アクションを実行する各タスクが独自のスレッド ローカル データを持つように、スレッド ローカル データを ActionBlock に渡す良い方法はありますか?
これは、おそらく私がやりたいことを明確にする私のコードの一部です:
ActionBlock が、私が提供するスレッド ローカルの init 関数を呼び出せるようにしたいと考えています。このようなもの:
そして、スレッド ローカル データを Action 関数に渡します。
c# - スレッドローカルストレージを使用したメモリリーク?
数日後、私たちの Web サイトは明らかにメモリ リーク (> 2Gb /pool) に悩まされています。それで、私はwindbgでいくつかのコマンドを実行し、最終的に何かを見つけました.たくさんありSystem.LocalDataStoreElement
ます. ソース コード (以下を参照) をすばやく検索したところ、非常に奇妙なクラスが見つかりました。
だから、私の質問:
- ここで Thread.AllocateDataSlot を使用することは明らかに役に立ちませんが、メモリ リークを説明できますか? 完全な負荷テスト (400,000 リクエスト以上) の後では、リークを再現できないためです。
- Web アプリケーションに TLS/ThreaStatic を使用することは適切ですか? asp.net では、スレッドの寿命を制御できず、ワーカー スレッドが多くの要求を実行するためです。
MS KB hereにも問題が見つかりました。
結論として、すべてがこのコードにあるようですが、問題を再現できませんでした。