1

ロックフリーキューの使用について質問があります。

プロデューサーとコンシューマーが別々のコアにバインドされている、単一プロデューサー、単一コンシューマーのキューがあるとします。キュー要素は共有メモリのバッファであり、最初にプロデューサとコンシューマの両方によって mmap されます。

プロデューサはキュー要素を取得し、バッファにデータを入力してキューに入れ、コンシューマは要素をデキューし、それを読み取り、何らかの方法で処理します。

ロックフリー キューのユーザーとして、プロデューサーによって書き込まれたバッファーがユーザーに表示されることを明示的に確認する必要がありますか? それとも、アルゴリズムの中心にある CAS (または他の同様の) プリミティブが自動的にバリアを提供しますか?

私が見たいくつかの例では、整数をペイロードとして使用しているため、このメモリ同期の問題は発生しません。

ありがとう、

4

4 に答える 4

0

コンペア アンド スワップなどのインターロックされたプリミティブには、通常、さまざまなメモリ バリア セマンティクスを持つバリアントがあります。それらはアーキテクチャ間で多少異なりますが、一般的には、(遅くとも) コンシューマに構造を可視化するプロデューサの操作に「リリース」セマンティクスが必要であり、コンシューマの前に「取得」セマンティクスを持つ何かが必要です。データ構造にアクセスします。

一部のアーキテクチャ (特にバニラ x86) では、すべてのインターロック操作が完全なバリアを意味するため、実際には選択肢がありません。他のアーキテクチャであなた。

(逆に、またマーフィーのおかげで、オプションを綿密に調査し、適切なバリアをあらゆる場所に挿入すると、おそらくイベントが共謀して、これまでに作成したコードを x86 以外で実行する必要がないようにします)。

于 2011-08-07T19:50:39.570 に答える
0

これは定義上、アーキテクチャ固有です。Intel CPU 上の GCC では、GCC Atomic Builinsを使用します。それらのほとんどは、完全なメモリ バリアを意味します。

于 2011-08-07T19:52:06.213 に答える
0

いくつかのアーキテクチャは、メモリ バリアを CAS にバインドします。x86/x64 は 1 つです。

他のもの (ARM など) はそうではありません。ARM では、前後に手動のデータのみのメモリ バリアを使用して LL/SC を実行します。

于 2011-08-09T02:02:50.000 に答える
0

ロックフリー キューのユーザーとして、プロデューサーによって書き込まれたバッファーがユーザーに表示されることを明示的に確認する必要がありますか? それとも、アルゴリズムの中心にある CAS (または他の同様の) プリミティブが自動的にバリアを提供しますか?

意味的には、並行キューへのデータのプッシュには少なくともリリース フェンスが必要であり、キューからのポップには少なくとも取得フェンスが必要です。私は、優れたロックフリーの実装は、ユーザーにメモリ フェンスなどへの配慮を強いるべきではないと考えています。ロックフリー アルゴリズムが自動的にフェンスを適切な場所に配置しない場合でも (またはすべてのアーキテクチャに対してではありません)、ユーザーではなく実装が正しい可視性と順序を確保する必要があります。ユーザーは、「正しく機能する」実装を選択することのみを気にする必要があります (これには、実際に機能することをテストする必要があります) :)

于 2011-08-12T09:39:08.510 に答える