問題タブ [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.

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

c# - SpinLock の方が速いと誰もが言うのはなぜですか?

私はインターネット上で多くのドキュメントや記事、投稿を読みました。ほとんどすべての人が、短い実行コードでは SpinLock の方が高速であると主張していますが、私がテストを行ったところ、単純な Monitor.Enter は SpinLock.Enter よりも高速に動作するように見えます (テストは .NET 4.5 に対してコンパイルされています)。

2.5 GHz の 24 コアを搭載したサーバーで、このアプリケーションを x64 でコンパイルすると、次の結果が得られました。

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

c# - C#のSpinLock。どのタイプのアルゴリズムでSpinLockがMonitorに対してより良い選択ですか?

重複の可能性:
なぜ誰もがSpinLockの方が速いと言っているのですか?

この質問は、SpinLock、Monitor、およびInterlockedに関するものです。

のパフォーマンスをテストする2つのテストを行いましたが、Monitorこれらのテストで混乱しました。SpinLockInterlocked

SpinLock私の混乱は、特に本当にどれだけ速いかということです。私のテストによると、SpinLockより遅いですMonitor。しかし、多くのドキュメントや記事に基づいて、SpinLockパフォーマンスを向上させる必要があります。

そして今、どのシナリオSpinLockでパフォーマンスが向上するのだろうか?

以下に、私が実行したテストの詳細を示します。

最初のテストでは、非常に短い操作を実行して同じ共有ロックオブジェクトにアクセスするスレッドをいくつか作成しました(または操作をまったく実行しませんでした。これは単なるテストです)。

2番目のテストでは、要素の配列と、この配列内の要素にランダムにアクセスするいくつかのスレッドを作成しました。各要素には独自のロックオブジェクトが含まれています。テストの場合、テストのSystem.Objectオブジェクトの場合と同様に、スレッドは配列要素内のint型のパブリック変数を使用して操作を実行します。MonitorSpinLockSpinLockInterlocked.IncrementInterlocked.Increment

各テストでは、共有領域へのアクセスがループで実行されます。各テストは、次の3つのルーチンで構成されています。

  • SpinLockのテスト
  • テストモニター
  • Increment.Interlockedのテスト

各テストは、それSpinLockがより遅いことを示しましたMonitor。したがって、前述のテストを実行して以来、私が気になる質問は、どのシナリオがパフォーマンスの向上に適しているかということです。SpinLock


詳細を説明するために、テストのコードを投稿します。

(両方のテストは.net 4.5に対してコンパイルされました)

テスト1、スレッドは同じ共有ロックオブジェクトへの排他的アクセスを取得しようとしています

テスト2、スレッドは、ランダムに選択された配列の要素への排他的アクセスを取得しようとしています。つまり、競合の少ないテストを実行します。


追加テスト3.テストはシングルスレッドで実行されます。スレッドがロックにアクセスする可能性が最も高くなります。

私が理解している限り、3番目のテストがSpinLock選択の最良のケースです。競合はまったくありません。シングルスレッド-シーケンス実行。なぜSpinLockまだはるかに遅れているのMonitorですか?誰かが私にSpinLock(デバイスドライバーの開発を除いて)まったく役立つことを証明するコードを教えてもらえますか?

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

c - この特定の状況では、spin_lock または mutex_lock を使用する必要がありますか?

私の Linux アプリには、同じクライアント ソケットUDPを使用してブロードキャスト パケット (約 50 ~ 500 バイト) を送信しようとする 2 つのスレッドがあります。UDP彼らはこれを2〜3秒ごとに約1回行います。この場合、「send(...)」句の周りにpthread_mutex_lockorを置くことができpthread_spin_lockます。理論によると、非常に小さな操作であれば、a のpthread_spin_lock方が効率的です (その短い時間で CPU の消費量が多いにもかかわらず)。しかし、それpthread_mutex_lockがより大きな操作である場合は、より良いです。

UDPを使用することを保証するのに「十分に小さい」と見なされるパケットを送信していますかpthread_spin_lock、それとも引き続き を使用する必要がありpthread_mutex_lockますか?

ありがとう

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

c++ - クリティカル セクションを boost::detail::spinlock に置き換え、Windows でデッド ロックが発生する

私のプラットフォームは vs2010 win2003 サーバーです。アプリケーションは正常に動作しています。クリティカル セクションによって保護されている整数があり、boost::detail::spinlock を変更して使用すると、代わりにデッド ロックになります。

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

c++ - O(1) 非メモリ連続コードでスピンロックを使用しても問題ありませんか?

ロックされたコードセクションで、通常はO(1)リスト要素へのアクセス/削除を伴うスピンロック ( pthreadのもの) を使用しています。

私が一般的に言うのは、99.9% のケースで、コードがリスト (1000 以上の要素を含む可能性がある) をループしないためです。コードは通常、リスト要素のヒントポインターに
基づいて 1 つの要素のみを抽出し、引用されたヒント要素を変更するためにいくつかのif分岐を実行します。それでも、メモリへの非連続アクセスである必要があります。

スピンロックを使用するのは良い考えですか、それともミューテックスに移行する必要がありますか?

私は最大のパフォーマンスを目指しています。このコンテキストでの CPU (オーバー) 使用は気にしません。

乾杯

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

c++ - C++ - ミューテックスとスピンロックの初期化と破棄

あるスレッドでミューテックスを割り当てて初期化し、別のスレッドで破棄することは可能ですか?

ありがとう。

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

synchronization - シングルプロセッサおよびマルチプロセッサのスピンロック

スピンロックがどのように機能するかを読んで研究しました。今、私は完全な答えを見つけることができない質問があります:

UP(ユニプロセッサ)環境およびSMP(対称型マルチプロセッサ)環境でどのように機能しますか?違いと問題は何ですか?

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

multithreading - スレッドが同じスピンロックを 2 回取得しようとしたときにデッドロックが発生するのはなぜですか?

1 つのスレッドが同じスピンロックを 2 回取得しようとすると、デッドロックが発生する理由を説明してもらえますか? (スピンロックが非再帰的であると仮定)

通常のスピンロックの使用法:

acquiring_lock(lock)ただし、2回目の呼び出しでデッドロックが発生する理由がわかりません?

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

c - 関数 do_raw_spin_lock が Linux でどのように実装されているか

スピンロックに関連するパニックの問題をデバッグしているときに、このスピンロックの定義に出くわしました

インクルード/linux/spinlock.h

. この定義を理解するのはかなり難しいです。関数__acquires(lock)の後に使用されるのはなぜですか? do_raw_spin_lockそのような宣言の意味は何ですか?

そのような宣言がどのようにデコードされ、機能するかを助けてください。