問題タブ [spinlock]
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.
.net - スピンロックまたはスピンウェイトを使用する .Net フレームワークの例はありますか?
並行コレクションを見てみましたが、ボンネットの下で通常のロックを使用しているようです。このロック構造を使用する .Net フレームワークに良い例はありますか?
私は最初に ConcurrentDictionary を見ました。通常のロックを使用していることがわかりましたが、BlockingCollection クラスは内部メソッドで SpinWait を使用しています。
iphone - iOSスレッドの問題
NSOparationInvokationで画像を読み込み、メインスレッドでメソッドを呼び出すと、この画像がスクロールビューに追加されますが、アプリが遅れることはほとんどありません。画像を読み込んでもビューを追加しない場合、アプリは正常に機能します。ビューアプリにテストボタンを追加しても正常に機能し、画像を読み込んでビューアプリにテストボタンを追加しても遅れはありません。__spin_lockのプロファイラーの問題による。誰かが何が悪いのか知っていますか?ありがとう。
locking - pthreads より高速なロック
私たちは非常に遅延に敏感なアプリケーションを構築しています。私たちの完全なアプリケーションは、ロック以外のプロセスで約 2500 クロック サイクルかかり、2 つのロックを取得して解放する必要があります。99.98% の確率で競合が発生しないことを期待しています。pthread のロックとロック解除を使用するには、さらに約 1800 サイクルかかります。より高速な定式化のヒントはありますか? アトミック操作に基づいてロックを作成するのは難しい場合があります。可能であれば、Linux ヘッダーまたはブースト ヘッダーのような標準コードを使用することをお勧めします。
lock-free - スピンロックには常にメモリバリアが必要ですか? メモリバリアでのスピンは高価ですか?
ほとんどの条件下で、ローカル読み取りで問題なく動作するロックフリー コードをいくつか書きました。
メモリ読み取りでのローカル スピンは、スピン読み取りの前に常にメモリ バリアを挿入する必要があることを意味しますか?
(これを検証するために、特定の非常に特定の条件下で、リーダーが書き込まれた値をまったく見ないという結果になるリーダー/ライターの組み合わせを作成することに成功しました。ループ内で実行されるため、矢印はその方向を指していますが、メモリバリアを通過するコストについては完全にはわかりません.)
キャッシュのストア バッファにフラッシュするものが何もない場合、メモリ バリアを介してスピンするコストはいくらですか? つまり、すべてのプロセスが (C で) 行っているのは、
それは無料であり、メモリバスにトラフィックを邪魔しないと仮定するのは正しいですか?
別の言い方をすれば、次のように質問することです: メモリ バリアは、ストア バッファーをフラッシュし、無効化を適用し、コンパイラーがその場所全体で読み取り/書き込みを並べ替えないようにする以上のことを行いますか?
逆アセンブルすると、__sync_synchronize() は次のように変換されます。
Intelのマニュアルから(同様に、初心者にとっては漠然としています):
私の翻訳: 「ロックと言うと、これはコストがかかりますが、必要な場合にのみ行っています。」
@BlankXavier:
ライターがストア バッファーから書き込みを明示的にプッシュアウトせず、それがその CPU で実行されている唯一のプロセスである場合、リーダーはライターの効果を確認できない可能性があることをテストしました (テスト プログラムで再現できますが、上で述べたように、特定のコンパイルオプションと専用のコア割り当てを使用した特定のテストでのみ発生します-私のアルゴリズムは正常に機能します。将来の問題)。
デフォルトでは、単純な書き込みはWB書き込み(ライトバック)であると思います。つまり、すぐにはフラッシュされませんが、読み取りは最新の値になります(「ストア転送」と呼ばれると思います)。そこで、ライタには CAS 命令を使用します。Intelのマニュアルで、これらすべての異なるタイプの書き込み実装(UC、WC、WT、WB、WP)、Intel vol 3A chap 11-10を発見し、まだそれらについて学んでいます。
私の不確実性は読者の側にあります.McKenneyの論文から、バスからキャッシュへの受信無効化のキューである無効化キューもあることがわかりました。この部分がどのように機能するかわかりません。特に、通常の読み取りをループする(つまり、ロックされていない、バリアなしで、揮発性を使用して、コンパイル後にオプティマイザーが読み取りを確実に残すようにする)と、毎回「無効化キュー」にチェックインすることを暗示しているようです。 (そのようなものが存在する場合)。単純な読み取りでは不十分な場合 (つまり、キューに入れられた無効化が保留されている間はまだ有効に見える古いキャッシュ ラインを読み取ることができます (これは私にも少し矛盾しているように聞こえますが、無効化キューはどのように機能するのでしょうか?))、アトミック読み取りは次のようになります。私の質問は次のとおりです。この場合、これはバスに影響を与えますか? (多分無いと思います。)
私はまだ Intel のマニュアルを読んでいますが、ストア フォワーディングについては素晴らしい議論が見られますが、無効化キューについては適切な議論が見つかりませんでした。C コードを ASM に変換して実験することにしました。これがどのように機能するかを実際に理解するには、これが最善の方法だと思います。
gcc - cmpxchgを使用したx86スピンロック
私はgccインラインアセンブリを使用するのは初めてで、x86マルチコアマシンでスピンロック(競合状態なし)を(AT&T構文を使用して)実装できるかどうか疑問に思っていました。
cocoa - ImageProviderReleaseInfoCallback / __spin_lock でデッドロックが発生する原因
NSOperationQueue
バックグラウンドで画像を処理するために多数のインスタンスを使用する Cocoa アプリケーションがあります。各キューは、基本的に以下を使用してNSImage
オブジェクトをCGImageRef
インスタンスに変換する呼び出し操作を処理します。
一部のユーザーは、アプリが突然応答しなくなったと不満を漏らしています。ActivityMonitor.app を使用してプロセス サンプルを収集するよう依頼しました。レポートはすべて非常に似ています。
への呼び出しの直後にdrain
キュー/スレッドがスタックしている間に、メインスレッドが自動解放プールを通過しているようです。__spin_lock
ImageProviderReleaseInfoCallback
ドキュメントによると、すべてのパラメータCGImageForProposedRect:
はオプションです。バックグラウンド スレッドから呼び出すことができる場合、彼らは何も言いません。多分それが問題ですか?ほとんどすべての場合に機能するため、私はそれを疑っています(アプリを何百回も問題なく起動しました...)
キューがスタックする理由はありますか?
完全なプロセスのサンプル:
javascript - Javascript でのスピンロック
javascriptでスピンロックを行うにはどうすればよいですか?
たくさんの画像をロードしようとしていますが、すべてがロードされた後にのみ先に進むことができるので、次のようなスピンロックがあります
そして、ブラウザがクラッシュします。それを行うより良い方法はありますか?または、行方不明の収量/スリープ機能はありますか?
macos - Mac OS X には pthread_spinlock_t タイプがありますか?
Mac では見つかりませんでしたが、ほとんどすべての Linux OS でサポートされています。Mac に移植する方法を知っている人はいますか?
windows - スピンロックの実装がWindowsXPとWindows7で異なるのはなぜですか?
スピンロックはWindowsのhal.dllによってエクスポートされることがわかっているので、スピンロックのコードをリバースエンジニアリングしました。結果は以下のとおりです。
WindowsXPの逆コンパイルされたスピンロック。
Windows7の逆コンパイルされたスピンロック。
バージョン間でコードが異なるのはなぜですか?特に、Windows 7バージョンで追加されたコードが、仮想化におけるスピンロックのパフォーマンスをどのように改善するかはわかりません。