/ /ロックフリープログラミングに関する疑問[閉鎖] - C ++、C、アセンブリ、ロックフリー

ロックフリープログラミングに関するいくつかの疑問[閉鎖] - c ++、c、アセンブリ、ロックフリー

こんにちはフォークス、
まず、申し訳ありませんが、これは適度に長い投稿になるでしょう。だから、忍耐を持って読んでください。

ここでは、私が学んだいくつかの概念を、ロックフリープログラミングに関するいくつかの記事を抜きにしながら書き留め、その学習に疑問を呈します。
また、* NIXマルチプロセッサー・プラットフォームについても説明します。

まず、「LOCKLESS = BLOCKLESS」と言って、スレッドのシステム全体が進行していると言います。これは、あるスレッドが進行した場合にのみCAS / DCASが失敗するためです。
したがって、ミューテックスでブロックする場合、条件をスピン/待機させていると言います(たとえば、CAS whileループなど)。

Quest1> whileループでのスピン処理は、
ミューテックス?
Quest2>ミューテックスを使った良い設計は、システムが確実に進歩するように
それはあまりにも明確ではありませんか?

質問1の答えとして、ブロッキングがカーネル待機に入り、コンテキストスイッチが高価になる可能性があると主張します。それ以上の明快さは認められるでしょう。

さて、最初の2つの質問の答えを得た後、私はロックフリーが本当に速くて実時間であると思うと確信します。 時間がかからない.

Quest3>スピンロックのようなロックフリーなものはありませんか?はいの場合、なぜ私たちは使用しません 
pthreadスピンロック?

先に進むと、ネット上で入手可能な文献のほとんどで、このような原子操作の実装が見えます:

__asm__ __volatile __( "locknxadd" X "%0、%1" : "= r"(結果)、 "= m"(*(T *)i_pAddress) : "0"(i_addValue) : "記憶"); // これは何を意味するのでしょうか ?メモリフェンシング?
Quest4>上記の ":memory"はメモリーフェンシングを意味しますか?もし、そうなら、 
それは実装するために約100サイクルかかりませんか?
Quest5>ここでロック命令は、操作が行われていると主張しない
他のスレッドはここでブロックしていますか?
私の知る限りでは
この質問は、多かれ少なかれ最近のインテルのマルチproc arch
キャッシュライン上でロックが行われるためです。

前もって感謝します。

回答:

回答№1は2

それはたくさんの質問です!

whileループでの回転は、mutexでのブロックよりも効率的です

リソースの大部分が競合していない場合、平均してスピンを長くする必要はありません。そのため、ミューテックスを使用するよりも安価になる可能性があります。

ミューテックスを採用した良いデザインは、システムが確実に進展することを保証します。

おそらく、待機しているスレッドにとってより公平です。リソースを待っている間に回転している場合、「不運な」スレッドは長い時間待たなければならないかもしれません。

だから、スピンロックのようなロックフリーなものはありませんか?もしそうなら、どうして私たちはスピンロックを使うことができませんか?

アルゴリズムをロックフリーにする方法についての良いアイディアがあれば、まったく回転させる必要はないかもしれません。

上記の ":memory"はメモリフェンシングを意味しますか?はいの場合、実装に約100サイクルかかりますか?

はい、必要なシステムでメモリフェンシングですそれ。多くのCPUキャッシュを同期させるには長い時間がかかります(おそらく100クロック以上)。一方、スピンロックやミューテックスは、正しく機能するためには、苗木フェンスが必要です。

ここでロック命令は、共有リソース上で操作が実行されていることをアサートしないため、他のスレッドはここでブロックしていますか?

他のスレッドで更新したばかりのデータが必要な場合は、そのスレッドが利用可能になるまで待つ必要があります 彼らの CPU。


回答№2については2
  1. ロックフリーは何とかいくつかのスピンロックを使用しますもの。しかし、ロックとしてスピンについて言えば、大規模なコードブロックを同期させたいと思っています。ロックフリーについて話すと、1つの割り当てを対象とします。通常は1つの命令だけです。長いものがやっているときは最初のものが回転し、短いものが終わったときには最初のものが回転します。最初のものは回転し続け、2番目の「回転」は単なる「再試行」です。

  2. 私が間違いを犯さなかった場合、「記憶」とは、メモリ変数をレジスタ変数に最適化します(正確ではありません。正確には、コンパイラにメモリの使用を強く指示する必要がありますが、ハードウェアメモリフェンシングとは関係ありません)。

  3. ロック命令は非ロック命令ほど高速ではありませんが、コンテキスト切り替えよりもまだ高速です。しかし、それは遅いので、通常回転するものを書くときは、まずノンロックテストを行います。合格した場合は、ロックされたものを実行します。