複数のスレッドが数を増やす場合のカウンターのような単純なものの場合。スレッドが待機する必要があるため、ミューテックスロックは効率を低下させる可能性があることを読みました。したがって、私にとっては、アトミックカウンターが最も効率的ですが、内部的には基本的にロックであると読みました。ですから、どちらかがもう一方よりも効率的であると私は混乱していると思います。
7 に答える
アトミック操作はプロセッサ サポート (比較およびスワップ命令) を利用し、ロックをまったく使用しませんが、ロックは OS に依存し、たとえば Win と Linux では異なる動作をします。
ロックは実際にはスレッドの実行を中断し、他のタスクのために CPU リソースを解放しますが、スレッドの停止/再起動時に明らかなコンテキスト切り替えオーバーヘッドが発生します。反対に、アトミック操作を試行するスレッドは待機せず、成功するまで試行を続けます (いわゆるビジー待機)。そのため、コンテキスト切り替えのオーバーヘッドは発生しませんが、CPU リソースを解放することもありません。
要約すると、一般に、スレッド間の競合が十分に少ない場合、アトミック操作はより高速です。コンテキスト切り替えとビジー待機の間のオーバーヘッドが最も低いことを知る信頼できる方法は他にないため、必ずベンチマークを行う必要があります。
アトミック整数は、カーネル モードで実行されるミューテックスよりもはるかに効率的なユーザー モードオブジェクトです。アトミック整数のスコープは単一のアプリケーションですが、ミューテックスのスコープはマシン上で実行中のすべてのソフトウェアです。
Java のアトミック変数クラスは、プロセッサが提供する比較およびスワップ命令を利用できます。
違いの詳細な説明は次のとおりです 。 http://www.ibm.com/developerworks/library/j-jtp11234/