問題タブ [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.
c# - SpinLock の方が速いと誰もが言うのはなぜですか?
私はインターネット上で多くのドキュメントや記事、投稿を読みました。ほとんどすべての人が、短い実行コードでは SpinLock の方が高速であると主張していますが、私がテストを行ったところ、単純な Monitor.Enter は SpinLock.Enter よりも高速に動作するように見えます (テストは .NET 4.5 に対してコンパイルされています)。
2.5 GHz の 24 コアを搭載したサーバーで、このアプリケーションを x64 でコンパイルすると、次の結果が得られました。
c# - C#のSpinLock。どのタイプのアルゴリズムでSpinLockがMonitorに対してより良い選択ですか?
重複の可能性:
なぜ誰もがSpinLockの方が速いと言っているのですか?
この質問は、SpinLock、Monitor、およびInterlockedに関するものです。
のパフォーマンスをテストする2つのテストを行いましたが、Monitor
これらのテストで混乱しました。SpinLock
Interlocked
SpinLock
私の混乱は、特に本当にどれだけ速いかということです。私のテストによると、SpinLock
より遅いですMonitor
。しかし、多くのドキュメントや記事に基づいて、SpinLock
パフォーマンスを向上させる必要があります。
そして今、どのシナリオSpinLock
でパフォーマンスが向上するのだろうか?
以下に、私が実行したテストの詳細を示します。
最初のテストでは、非常に短い操作を実行して同じ共有ロックオブジェクトにアクセスするスレッドをいくつか作成しました(または操作をまったく実行しませんでした。これは単なるテストです)。
2番目のテストでは、要素の配列と、この配列内の要素にランダムにアクセスするいくつかのスレッドを作成しました。各要素には独自のロックオブジェクトが含まれています。テストの場合、テストのSystem.Object
オブジェクトの場合と同様に、スレッドは配列要素内のint型のパブリック変数を使用して操作を実行します。Monitor
SpinLock
SpinLock
Interlocked.Increment
Interlocked.Increment
各テストでは、共有領域へのアクセスがループで実行されます。各テストは、次の3つのルーチンで構成されています。
- SpinLockのテスト
- テストモニター
- Increment.Interlockedのテスト
各テストは、それSpinLock
がより遅いことを示しましたMonitor
。したがって、前述のテストを実行して以来、私が気になる質問は、どのシナリオがパフォーマンスの向上に適しているかということです。SpinLock
詳細を説明するために、テストのコードを投稿します。
(両方のテストは.net 4.5に対してコンパイルされました)
テスト1、スレッドは同じ共有ロックオブジェクトへの排他的アクセスを取得しようとしています
テスト2、スレッドは、ランダムに選択された配列の要素への排他的アクセスを取得しようとしています。つまり、競合の少ないテストを実行します。
追加テスト3.テストはシングルスレッドで実行されます。スレッドがロックにアクセスする可能性が最も高くなります。
私が理解している限り、3番目のテストがSpinLock
選択の最良のケースです。競合はまったくありません。シングルスレッド-シーケンス実行。なぜSpinLock
まだはるかに遅れているのMonitor
ですか?誰かが私にSpinLock
(デバイスドライバーの開発を除いて)まったく役立つことを証明するコードを教えてもらえますか?
c - この特定の状況では、spin_lock または mutex_lock を使用する必要がありますか?
私の Linux アプリには、同じクライアント ソケットUDP
を使用してブロードキャスト パケット (約 50 ~ 500 バイト) を送信しようとする 2 つのスレッドがあります。UDP
彼らはこれを2〜3秒ごとに約1回行います。この場合、「send(...)」句の周りにpthread_mutex_lock
orを置くことができpthread_spin_lock
ます。理論によると、非常に小さな操作であれば、a のpthread_spin_lock
方が効率的です (その短い時間で CPU の消費量が多いにもかかわらず)。しかし、それpthread_mutex_lock
がより大きな操作である場合は、より良いです。
UDP
を使用することを保証するのに「十分に小さい」と見なされるパケットを送信していますかpthread_spin_lock
、それとも引き続き を使用する必要がありpthread_mutex_lock
ますか?
ありがとう
c++ - クリティカル セクションを boost::detail::spinlock に置き換え、Windows でデッド ロックが発生する
私のプラットフォームは vs2010 win2003 サーバーです。アプリケーションは正常に動作しています。クリティカル セクションによって保護されている整数があり、boost::detail::spinlock を変更して使用すると、代わりにデッド ロックになります。
c++ - O(1) 非メモリ連続コードでスピンロックを使用しても問題ありませんか?
ロックされたコードセクションで、通常はO(1)リスト要素へのアクセス/削除を伴うスピンロック ( pthreadのもの) を使用しています。
私が一般的に言うのは、99.9% のケースで、コードがリスト (1000 以上の要素を含む可能性がある) をループしないためです。コードは通常、リスト要素のヒントポインターに
基づいて 1 つの要素のみを抽出し、引用されたヒント要素を変更するためにいくつかのif分岐を実行します。それでも、メモリへの非連続アクセスである必要があります。
スピンロックを使用するのは良い考えですか、それともミューテックスに移行する必要がありますか?
私は最大のパフォーマンスを目指しています。このコンテキストでの CPU (オーバー) 使用は気にしません。
乾杯
c++ - C++ - ミューテックスとスピンロックの初期化と破棄
あるスレッドでミューテックスを割り当てて初期化し、別のスレッドで破棄することは可能ですか?
ありがとう。
synchronization - シングルプロセッサおよびマルチプロセッサのスピンロック
スピンロックがどのように機能するかを読んで研究しました。今、私は完全な答えを見つけることができない質問があります:
UP(ユニプロセッサ)環境およびSMP(対称型マルチプロセッサ)環境でどのように機能しますか?違いと問題は何ですか?
multithreading - スレッドが同じスピンロックを 2 回取得しようとしたときにデッドロックが発生するのはなぜですか?
1 つのスレッドが同じスピンロックを 2 回取得しようとすると、デッドロックが発生する理由を説明してもらえますか? (スピンロックが非再帰的であると仮定)
通常のスピンロックの使用法:
acquiring_lock(lock)
ただし、2回目の呼び出しでデッドロックが発生する理由がわかりません?
c - 関数 do_raw_spin_lock が Linux でどのように実装されているか
スピンロックに関連するパニックの問題をデバッグしているときに、このスピンロックの定義に出くわしました
インクルード/linux/spinlock.h
. この定義を理解するのはかなり難しいです。関数__acquires(lock)
の後に使用されるのはなぜですか? do_raw_spin_lock
そのような宣言の意味は何ですか?
そのような宣言がどのようにデコードされ、機能するかを助けてください。