Thread.SpinWait メソッドの目的は何ですか? 質問する

Thread.SpinWait メソッドの目的は何ですか? 質問する

からマイクロソフトその目的は実際には明らかではありません。

集中的な CPU 計算テストをシミュレートするために使用できますか?

ベストアンサー1

非常に短時間のスリープコールの代わりとして使用されます。

マルチスレッド ロックを実行する場合、取得しようとしているリソースがすでにロックされていると、通常はスリープ状態になり、解放されるまで待機します。これを行うと、スケジューラによって割り当てられたプロセッサ使用の残りの時間を放棄し、他のユーザーが使用できるようにします。通常、これは問題ありません。特に IO の待機などの長い待機の場合、ディスク スピンドルの回転を待機している間に、他の多数のプロセスを CPU で実行できます。

しかし、時にはほんの少しの時間だけ待つこともあります。このような場合、通常は残り時間を放棄し、他のすべてのスレッドが処理を終えてからもう一度やり直すことになります。そのため、待つ代わりに、そこに座り続けて「もうすぐ終わりか?」というようにポーリングを続けるというごまかしができます。ロックが残り時間のほんの一部だけ保持される場合、これは非常に効果的な待機手段になります。また、通常どおり待機した場合に放棄した時間を使用するために、スケジューラが他のすべてのスレッドの再配置に関与する必要がないため、非常に効率的です。

当然ですが、ロックしたいときに毎回スピンすると、あまり人気が出ず、アプリの動作が遅くなり、CPU を 100% 使用しますが、適切なタイミングで少量ずつスピンすると、アプリの応答性が向上します。

「いつ使用すればいいのだろう?」と考えている場合、これは難しい判断です。非常に頻繁にロックされ、非常に素早くロック解除されるリソースがある場合、待機する代わりにスピンロックを使用することをお勧めします (その後、アプリのパフォーマンスをテストします)。短時間スピンしてから通常の待機に戻るのも合理的な方法です。ただし、一般的には、これを使用する必要はありません。

おすすめ記事