2013-04-30 11 views
31

ミューテックスよりアトミックを使用する主な理由は、ミューテックスは高価ですが、atomicsのデフォルトメモリモデルはmemory_order_seq_cstですが、これは高価ではありませんか?`std :: mutex`との同期が` std :: atomic(memory_order_seq_cst) `よりも遅いのですか?

質問:同時にロックを使用するプログラムは、同時ロックフリープログラムほど速くできますか?

アトミックにmemory_order_acq_relを使用しない限り、それは努力する価値がありません。


編集: 私は、各ロックがあまりにも完全なメモリバリアなければならないだろうので、ロックフリーよりも高速ロック・ベースカントが、何かが欠けていてもよいです。しかし、ロックフリーでは、メモリ障壁の制限が少ない技術を使用することが可能です。

私の質問に戻ると、デフォルトのmemory_modelで新しいC++ 11標準をベースにしたロックよりも速くロックフリーですか?

「ロックフリー」=「パフォーマンス測定時のロックベース」はtrueですか? 2つのハードウェアスレッドを仮定しましょう。


編集2: 私の質問が進行保証に関するものではありません、そして多分私は文脈の外に「ロックフリー」を使用しています。

基本的に共有メモリを持つ2つのスレッドがあり、必要な唯一の保証は、一方のスレッドが書き込みをしてからもう一方のスレッドが読み書きできない場合、私の前提は単純なアトムcompare_and_swap操作ミューテックスをロックするよりも高速です。

1つのスレッドが共有メモリに触れることがないと、何も理由なくロックとロック解除が繰り返されますが、アトミック操作では毎回1 CPUサイクルしか使用しません。

コメントに関して、スピンロックとミューテックスロックは、競合が非常に少ない場合は非常に異なります。

+0

ロック、ロックフリー、および待機フリーコードの間には、さまざまな進歩的な保証があります。 –

+8

[必須の読書](http://www.1024cores.net/home/lock-free-algorithms)。 –

+1

watch:https://www.youtube.com/watch?v=DCdGlxBbKU4 – NoSenseEtAl

答えて

53

Lockfreeプログラミングを約進展がを保証している:最強から最弱に、それらは待機フリーロックフリー障害物のない、およびをブロックします。

保証は高価で価格がかかります。あなたが望む保証が多くなれば、支払う額は増えます。一般的に、ブロッキングアルゴリズムやデータ構造(mutexを持つ)は最大限の自由を持ち、潜在的に最速です。他の極端なウェイトフリーアルゴリズムでは、各ステップでアトミック操作を使用する必要がありますが、これははるかに遅くなる可能性があります。

ロックを取得することは実際にはかなり安いので、件名を深く理解することなく、ロックを心配する必要はありません。さらに、mutexを使用したブロックアルゴリズムは、多くの場合、が読みやすく、書きやすく、理由があります。対照的に、もっともシンプルなロックフリーのデータ構造でさえ、1つまたは複数のPhDの価値がある、長く集中した研究の結果です。

ロックまたはウェイトフリーのアルゴリズムは、平均レイテンシとスループットが最悪のレイテンシになります。すべてが遅いですが、何も今までにありません非常にが遅いです。これは、非常に特殊な状況(リアルタイムシステムのような)でのみ有用な非常に特殊な特性です。

+0

ok - しかし共有データを持つ2つのスレッド...あなたはスピンロックブロッキングロックよりも高速ですか? – jaybny

+0

例えば、2つのスレッド上の2つの交換からのティックを聞く取引アプリケーション。スピンロックはミューテックスよりはるかに高速でしょうか? – jaybny

+4

@jaybny:いいえ、なぜですか。また、スピンロックもロックです。基本的な保証は変更されません。そして、楽しい驚きのためにpthread mutexの実装を見てください。 –

2

ロックは、単純なアトミック操作よりも多くの操作を必要とする傾向があります。最も単純なケースでは、memory_order_seq_cstはロックの約2倍の速さになります。なぜなら、ロックするには、実装に少なくとも2つのアトミック操作(1つはロックする、もう1つはアンロックする)が必要になる傾向があるからです。多くの場合、それ以上の時間がかかります。しかし、一旦メモリオーダーを利用し始めると、より少ない同期を受け入れる意思があるので、はるかに高速になる可能性があります。

また、「ロックアルゴリズムは常にロックフリーアルゴリズムほど高速です」と表示されることがあります。これはやや真実です。基本的な考え方は、最速のアルゴリズムがロックフリーである場合、ロックフリーの保証なしで最速のアルゴリズムが同じアルゴリズムであるということです。しかしながら、最も速いアルゴリズムがロックを必要とする場合、ロックフリー保証を要求するものは、より遅いアルゴリズムを見つけなければならない。

通常、特殊なオペコードを利用するパフォーマンスが役立ついくつかの低レベルアルゴリズムでは、ロックフリーアルゴリズムが表示されます。ほぼすべての他のコードでは、ロックは満足できるパフォーマンス以上のものであり、読みやすくなっています。

+0

"ロックアルゴリズムは常にロックフリーアルゴリズムほど高速です。" - 私はちょうどこれを取得しないでください。共有メモリーを持つスレッドセーフループは、単純なcompare_exchangeとlock(mutex)unlock(mutex)を行う方がはるかに高速です。特に別のスレッドからの競合がない場合は特にそうです。 – jaybny

関連する問題