5

私は持っていstd::atomic<int>* key, *valます;

両方書きたい。これらの値を同時に読み取る複数のスレッドがあります。val が key の前に書き込まれるようにしたい。つまり、読者が key の新しい値を確認した場合、val の新しい値も確認する必要があります。古いキーで新しい val を確認することも、古い値の両方を確認することも問題ありません。コードは、緩和されたプロセッサ アーキテクチャ (ARM) で動作する必要があります。

通常は (in-order) を実行して (in-order)val->store(x, relaxed), key->store(y, release)でロードするだけで十分key->load(acquire), val-load(relaxed)です。ARM では、取得はロード バリアを挿入し、リリースはストア バリアを挿入すると考えています。ただし、さまざまな理由から、val の読み取りにアトミックを使用していません。すべての読み取りアクセスでバリアを使用するとコストがかかりすぎます。

2 つのストア間でストア バリア (x86 のフェンス) だけを使用して順序を強制することはできますか? key と val の古い値が表示されてもまったく問題ありません。確実にしたいのは、キーの新しい値が別のコアによって認識された場合、val の新しい値も認識される必要があることだけです。リーダーは常にキーを最初に読み取り、val の読み取りはキーの値に依存します (メモリ アドレスであっても)。キーの前に読みます。val を探す場所を知るために、key を読み取る必要があります。コードが負荷バリアなしで動作できるようにするのは、このプロパティだと思います。

私は正しいですか?

4

0 に答える 0