Derecho システム(データ レプリケーション、分散調整、Paxos -- 超高速用のオープン ソース C++ ライブラリ) は、非同期 RDMA ネットワーク プリミティブを中心に構築されています。送信側は、受信側メモリへの RDMA 転送を使用して、一時停止することなく受信側に書き込むことができます。通常、これは 2 つの手順で行われます。データ バイトを 1 回の操作で転送し、カウンターをインクリメントするか、フラグを設定して受信者に通知します。「メッセージ 67 の準備ができました」。すぐに、受信者はメッセージ 67 の準備が整ったことに気付き、その時点でそのメッセージのバイトにアクセスします。
意図されたセマンティック: 「更新されたカウンターを確認することは、受信者の C++ コードがメッセージのバイトを確認することを意味する必要があります。」PL の用語では、ガードの更新とメッセージのバイトの間にメモリ フェンスが必要です。個々のキャッシュラインも連続して一貫している必要があります。私のガードは 67、68 などの値を通過します。また、C++ の場合に発生する可能性があるような、マッシュアップされた値や非単調なシーケンスの形式は必要ありません。古いキャッシュ ラインを読み取るか、誤って古い値をメモリに保持します。メッセージ バッファ自体についても同じです。これらのバイトは古いバイトを上書きする可能性があり、ある種のマッシュアップを見たくありません。
これが私の質問の要点です。不要なオーバーヘッドを導入することなく、[正確に]必要なバリアを課す弱いアトミックが必要です。どの注釈が適切でしょうか? 弱いアトミック アノテーションは、「メッセージ」とカウンター (「ガード」) で同じでしょうか?
二次的な質問: 適切な弱いアトミックでバッファーを宣言する場合、それが「揮発性」であると言う必要がありますか、それともメモリが弱いアトミックと宣言されているため、C++ はこれを認識しますか?