問題タブ [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 - スレッド ローカル ストレージが非常に遅いのはなぜですか?
私は、スレッド ローカル領域から割り当てることによって動作する D プログラミング言語用のカスタム マーク リリース スタイルのメモリ アロケータに取り組んでいます。割り当てごとに TLS ルックアップを 1 つだけ持つようにコードを設計した後でも、スレッド ローカル ストレージのボトルネックにより、これらの領域からメモリを割り当てる際に、他の点では同一のシングル スレッド バージョンのコードと比較して、大幅な (〜 50%) 速度低下が発生しているようです。割り当て解除。これは、ループ内で何度もメモリを割り当て/解放することに基づいており、ベンチマーク方法のアーティファクトであるかどうかを判断しようとしています。私の理解では、スレッド ローカル ストレージは基本的に、ポインターを介して変数にアクセスするのと同様に、追加の間接レイヤーを介して何かにアクセスする必要があるということです。これは間違っていますか?スレッド ローカル ストレージの通常のオーバーヘッドはどれくらいですか?
注: D について言及していますが、D に固有ではない一般的な回答にも関心があります。D のスレッド ローカル ストレージの実装は、最適な実装よりも遅い場合は改善される可能性が高いためです。
c++ - スレッドローカル シングルトン
使用されるスレッドごとに 1 回インスタンス化されるシングルトン クラスを作成したいと思います。インスタンス ポインターを TLS スロットに格納したいと考えています。私は次の解決策を考え出しましたが、スレッド ローカル ストレージが関係している場合に、singelton ファクトリへのマルチスレッド アクセスに関する特別な考慮事項があるかどうかはわかりません。スレッド ローカル シングルトンを実装するためのより良い解決策もあるかもしれません。
Tls* 関数はもちろん win32 固有ですが、ここでは移植性は主な問題ではありません。他のプラットフォームに関するあなたの考えは、依然として価値があります。
主な編集:私はもともと、このシナリオで二重チェックのロックを使用することについて尋ねていました. ただし、DavidKが指摘したように、シングルトンはスレッドごとに作成する必要があります。
残りの 2 つの質問は次のとおりです。
TlsGetValue/TlsSetValue で応答して、各スレッドが 1 つのインスタンスを取得し、インスタンスがスレッドごとに 1 回だけ作成されるようにすることは適切ですか?
そのスレッドが終了したときに特定のスレッドに関連付けられたインスタンスをクリーンアップできるようにするコールバックを登録することは可能ですか?
python - Pythonでローカルストレージをスレッド化する
Pythonでスレッドローカルストレージを使用するにはどうすればよいですか?
関連している
- Pythonの「スレッドローカルストレージ」とは何ですか?なぜそれが必要なのですか?-このスレッドは、変数が共有されている場合に焦点を当てているようです。
- 特定の関数がPythonのスタックにあるかどうかを判断する効率的な方法-AlexMartelliが優れたソリューションを提供します
static - 他の場所で使用されているローカルストレージをスレッド化しますか?
スレッドローカルストレージは、グローバル変数と静的変数をスレッドに対してローカルにする以外の場所で使用されていますか?それは、私たちが作成する新しいコードで役立ちますか?
linux - Linux のスレッド ローカル ストレージの実装
「foo」は実際にどのように解決されますか? コンパイラは "foo" のすべてのインスタンスを暗黙のうちに関数呼び出しに置き換えますか? 「foo」はスタックの下部に相対的な場所に保存され、コンパイラはこれを「ねえ、各スレッドについて、スタックの下部近くにこのスペースを確保し、foo は「スタックの下部からのオフセット x」として保存されます。 "?
c++ - スレッドローカルメモリ、cスタイルのスクラッチメモリ用のstd::stringの内部バッファを使用
私はProtocolBuffersとOpensSSLを使用して生成し、HMACを使用してから、CBCが2つのフィールドを暗号化して、セッションCookie(同様のKerberosトークン)を難読化します。
ProtocolBuffersのAPIはstd::stringsと通信し、バッファキャッシングメカニズムを備えています。同じスレッドでの連続した呼び出しに対して、スレッドローカルメモリに配置することにより、キャッシュメカニズムを利用します。さらに、OpenSSLHMACとEVPCTXも同じスレッドローカルメモリ構造に配置されます(スレッドローカルメモリを使用する理由と、単一スレッドでも可能になる大幅な高速化の詳細については、この質問を参照してください)。
これらのCookie文字列の生成と逆シリアル化「myalgorithms」は中間void *
のsとstd::string
sを使用し、Protocol Buffersには内部メモリ保持メカニズムがあるため、「myalgorithms」にこれらの特性が必要です。
では、一般的なスクラッチメモリを実装するにはどうすればよいですか?std :: stringオブジェクトのrdbuf(streambuf --strinbuf ??)についてはよくわかりません。おそらく、「私のアルゴリズム」の実行中にこれまでに遭遇した最小の一般的なサイズにそれを拡大する必要があるでしょう。考え?
私の質問は次のようになります。「文字列の内部バッファは再利用可能ですか。再利用できる場合は、どのように使用しますか?」
編集(新しい質問):
Vladの投稿後、std::stringとvoid*cスタイルのスクラッチバッファが必要であることが反映されているようです。私の質問は次のようになります:人気のあるstlの文字列実装は、メモリを必要としないときにメモリを保持しますか?(私のニーズはおそらく128バイトから10KBの間にとどまるでしょう)。
c++ - スレッドローカルストレージのセグメンテーションフォールトは NetBSD のみ?
C++ プログラムを実行しようとすると、NetBSD に固有のように見えるセグメンテーション違反が発生します。Bert Hubert は (このメッセージの最後に) 簡単なテスト プログラムを書きましたが、実際、NetBSD でのみクラッシュします。
他の Unix では問題なく動作します。C++ スレッドローカルストレージを使用する NetBSD に既知の問題はありますか?
c++ - C++ TLS、何かがおかしい
Thread Local Storage について学んでいます... (TLS) これが私の TLS Alloc コードです:
ここで、TLS から値を取得しようとします: (別の CPP ファイルで)
しかし、データには 0 が含まれており、そこに 5 を入れました....何が間違っていたのでしょうか?
c++ - Win32 API でスレッド ローカル ストレージを動的に解放する方法はありますか?
クロスプラットフォーム プロジェクトでスレッド ローカル ストレージを利用する必要があります。*IX では pthreads を使用しており、 の 2 番目の引数として渡される素敵なデストラクタ関数ポインタのおかげでメモリ リークを回避できますpthread_key_create
が、WindowsTlsAlloc
ではそのようなことはありません。また、スレッドの終了時に関数が呼び出される一般的な場所を見つけることもできません (それ以外の場合は、終了時に呼び出される関数ポインターのリストを自作します)。
現状では、スレッドローカルストレージを実際に使用するには、ヒープに独自のスペースを割り当ててへのポインターを渡す必要があるという状況が基本的にあるようですがTlsSetValue
、スレッドが終了した場合...私には保証する方法がありませんメモリが解放されました (誰かが明示的に呼び出しTlsGetValue
ている場合と、スレッド関数の最後に // /etc がある場合を除きますdelete
。free
HeapFree
誰かがより良い方法を知っていますか?
c - C99の一部である__threadのスプリントバーフ
ランニングスプリント
この行で停止します:
解析エラーの場合:
ドキュメントとうがいをチェックすると、の言及はありません__thread
。ただし、これはSplintがサポートしているとされる__thread
C99仕様の一部です(参照を挿入)。
何が起きてる?スプリントに認識させるにはどうすればよい__thread
ですか?