問題タブ [relaxed-atomics]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
289 参照

c++ - std::atomic の安価な代替手段?

各スレッドがオブジェクトに削除のマークを付けることができるマルチスレッドアプリケーションにオブジェクトのクラスがあり、その後、中央のガベージコレクタースレッドが実際にオブジェクトを削除します。スレッドは、内部 bool にアクセスするメンバー メソッドを介して通信します。

Thread Sanitizer が不平を言い続けたため、bool は過去に他の誰かによってアトミックにされました。ただし、perf は、内部のアトミック ロード中に処理のオーバーヘッドがあることを示唆しています。

ターゲット プラットフォームは、GCC、Aarch64、および Yocto Linux です。

今、私の質問は次のとおりです。

  • この場合、アトミックは本当に必要ですか? bool の遷移は一方向 (false から true) であり、オブジェクトが存続している間は元に戻すことはできません。したがって、不整合は、オブジェクトが少し後に削除されることを意味するだけですよね?

  • std::atomic<bool>スレッドサニタイザーを沈黙させますが、より計算的に安価な代替手段はありstd::atomic<bool>ますか?

0 投票する
1 に答える
115 参照

c++ - 複数のスレッドからのsteady_clock::now の値はメモリ順序と一致していますか?

1 つのスレッド内で、steady_clock::now()単調に増加する値を返すことが保証されます。これは、複数のスレッドによって観察されるメモリの順序付けと読み取りとどのように相互作用しますか?

重要な点は次のとおりです。

これらの主張が失敗することはありますか? または、解放メモリの取得順序について何か誤解していますか?

以下は、主に私のコード例の説明と詳細です。

スレッドt1はアトミックに書き込みますarg。また、書き込み前後の現在時刻もそれぞれ記録しaますbsteady_clockことを保証しa <= bます。

スレッドt2はアトミックから読み取り、読み取っargた値を に保存しますe。また、読み込み前後の現在時刻もそれぞれ記録しcますdsteady_clockことを保証しc <= dます。

その後、両方のスレッドが結合されます。この時点でまたはであるe可能性があります。01

の場合e0t2書き込む前に値を読み取りますt1これはまた、以前に起こったことを意味しますか?c = now()t2b = now()t1

その場合e1、読み取るt1前に値を書き込みます。これはまた、以前に起こったことを意味しますか?t2a = now()t1d = now()t2


私が求めていることに答えないいくつかの既存の質問があります:

マルチコアコンテキストでも std::chrono スレッドセーフ保証はありますか?

now()スレッドセーフかどうかは尋ねていません。私はそれを知っています。

steady_clock はスレッド間で単調ですか?

これはもっと近いですが、その例ではmutex. メモリの順序付けについて同じ仮定を よりも弱くすることはできますseq_cstか?

0 投票する
1 に答える
66 参照

c++ - C++: 非同期を受け取るバッファーに使用する弱いアトミック。RDMA転送?

Derecho システム(データ レプリケーション、分散調整、Paxos -- 超高速用のオープン ソース C++ ライブラリ) は、非同期 RDMA ネットワーク プリミティブを中心に構築されています。送信側は、受信側メモリへの RDMA 転送を使用して、一時停止することなく受信側に書き込むことができます。通常、これは 2 つの手順で行われます。データ バイトを 1 回の操作で転送し、カウンターをインクリメントするか、フラグを設定して受信者に通知します。「メッセージ 67 の準備ができました」。すぐに、受信者はメッセージ 67 の準備が整ったことに気付き、その時点でそのメッセージのバイトにアクセスします。

意図されたセマンティック: 「更新されたカウンターを確認することは、受信者の C++ コードがメッセージのバイトを確認することを意味する必要があります。」PL の用語では、ガードの更新とメッセージのバイトの間にメモリ フェンスが必要です。個々のキャッシュラインも連続して一貫している必要があります。私のガードは 67、68 などの値を通過します。また、C++ の場合に発生する可能性があるような、マッシュアップされた値や非単調なシーケンスの形式は必要ありません。古いキャッシュ ラインを読み取るか、誤って古い値をメモリに保持します。メッセージ バッファ自体についても同じです。これらのバイトは古いバイトを上書きする可能性があり、ある種のマッシュアップを見たくありません。

これが私の質問の要点です。不要なオーバーヘッドを導入することなく、[正確に]必要なバリアを課す弱いアトミックが必要です。どの注釈が適切でしょうか? 弱いアトミック アノテーションは、「メッセージ」とカウンター (「ガード」) で同じでしょうか?

二次的な質問: 適切な弱いアトミックでバッファーを宣言する場合、それが「揮発性」であると言う必要がありますか、それともメモリが弱いアトミックと宣言されているため、C++ はこれを認識しますか?

0 投票する
1 に答える
37 参照

c++ - std::memory_order_relaxed with fetch_add

リラックスしたメモリの順序付けについてより深く理解しようとしています。CPP リファレンスによると、同期はありませんが、アトミック性は保証されています。この場合のアトミック性は、何らかの形式の同期を必要としません。たとえば、特に書き込みが異なるスレッドに順不同で表示される場合、 1 つのスレッドのみが からにfetch_add()値を更新することをどのように保証しますか? に関連する暗黙の同期はありますか?yy+1fetch_add

memory_order_relaxed 緩和された操作: 他の読み取りまたは書き込みに課される同期または順序付けの制約はなく、この操作の原子性のみが保証されます (以下の緩和された順序付けを参照)。