ミューテックスよりもアトミックを使用する主な理由は、ミューテックスが高価であるということですが、デフォルトのメモリモデルが でatomics
あるためmemory_order_seq_cst
、これは同じくらい高価ではありませんか?
質問: ロックを使用する並行プログラムは、ロックのない並行プログラムと同じくらい高速にできますか?
memory_order_acq_rel
もしそうなら、アトミックに使いたくない限り、努力する価値はないかもしれません。
編集:私は何かが欠けているかもしれませんが、各ロックも完全なメモリバリアでなければならないため、ロックベースはロックフリーよりも高速ではありません。しかし、ロックフリーを使用すると、メモリ バリアよりも制限の少ない手法を使用できます。
私の質問に戻りますが、ロックフリーは新しい C++11 標準に基づくロックよりも高速memory_model
ですか?
「パフォーマンスで測定するとロックフリー>=ロックベース」は本当ですか? 2 つのハードウェア スレッドがあるとします。
編集 2: 私の質問は、進行の保証に関するものではありません。おそらく、コンテキスト外で「ロックフリー」を使用している可能性があります。
基本的に、共有メモリを持つ2つのスレッドがあり、必要な唯一の保証は、一方のスレッドが書き込みを行っている場合、もう一方のスレッドが読み書きできないということです。私の仮定は、単純なアトミックcompare_and_swap
操作の方がミューテックスをロックするよりもはるかに高速であるということです.
1 つのスレッドが共有メモリにまったく触れない場合、理由もなく何度もロックとロック解除を繰り返すことになりますが、アトミック操作では毎回 1 CPU サイクルしか使用しません。
コメントに関しては、競合がほとんどない場合、スピンロックとミューテックスロックは大きく異なります。