問題タブ [memory-fences]

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 投票する
1 に答える
1172 参照

opencl - OpenCL 1.2: mem_fence() または barrier() またはその両方

openCL C プログラミングを始めたばかりです。ワーク グループのすべてのワーク アイテムは、ローカル メモリの一意の場所を更新します。その後、他の 2 つのワークアイテムによって更新されたローカルデータに基づいて、ワークアイテムのプライベート変数が更新されます。このようなもの:

上記のスニペットは保守的ですが、バリアは内部でフェンシングを行っているため、その役割を果たしているのではないでしょうか?

0 投票する
3 に答える
1994 参照

c# - C# volatile 変数: メモリ フェンス VS. キャッシング

そのため、このトピックについてかなり長い間調査しましたが、リリースやメモリフェンスの取得などの最も重要な概念を理解していると思います。

volatileしかし、 とメイン メモリのキャッシングとの関係については、満足のいく説明が見つかりませんでした。

したがって、フィールドへの/からのすべての読み取りおよび書き込みvolatileでは、読み取りとその前後の書き込み操作 (読み取り-取得および書き込み-解放) の厳密な順序が強制されることを理解しています。しかし、それは操作の順序を保証するだけです。これらの変更が他のスレッド/プロセッサに表示される時間については何も述べていません。特に、これはキャッシュがフラッシュされる時間に依存します (存在する場合)。volatile「フィールドが存在すると、キャッシュの最適化が自動的に無効になる」という行に沿って何かを言っている Eric Lippert からのコメントを読んだことを覚えています。しかし、これが何を意味するのか正確にはわかりません。キャッシュが1つあるという理由だけで、プログラム全体でキャッシュが完全に無効になっているということですかvolatileどこかのフィールド?そうでない場合、キャッシュが無効になっている粒度は何ですか?

また、私は強い揮発性セマンティクスと弱い揮発性セマンティクスについて何かを読みました.C#は、volatileフィールドであるかどうかに関係なく、すべての書き込みが常にメインメモリに直接送信される強いセマンティクスに従います。私はこれらすべてについて非常に混乱しています。

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

c++ - 複数のスレッドで C++ ロックレス キューがクラッシュする

複数のスレッドをコーディングするときのメモリ順序の制御について理解を深めようとしています。過去にミューテックスを使用して変数アクセスをシリアル化してきましたが、パフォーマンスを向上させるために可能な限りミューテックスを使用しないようにしています。

多くのスレッドによって満たされ、多くのスレッドによって消費される可能性のあるポインターのキューがあります。単一のスレッドでは正常に動作しますが、複数のスレッドで実行するとクラッシュします。コンシューマーがポインターの複製を取得している可能性があるようです。これにより、ポインターが 2 回解放されます。printステートメントを入力すると、クラッシュすることなく正常に動作するため、わかりにくいです。

まず、ポインターを保持するために事前に割り当てられたベクターを使用しています。ベクター内のどの要素を処理する必要があるかを追跡するために、3 つのアトミック インデックス変数を保持しています。要素自体がアトミックである _queue タイプを使用しようとしたことは注目に値するかもしれませんが、それは役に立たないようです。より単純なバージョンは次のとおりです。

しかも同じクラスから

これが機能しない理由を理解することに本当に興味があることを強調しておきます。他の既製のパッケージを実装すると、この問題を回避できますが、後で同じタイプの間違いを犯さないようにすることはできません。

UPDATE アレクサンドル・コノバロフの答えを正しいとマークしています(以下の彼の答えのコメントを参照してください)。誰かがこのページに出くわした場合のために、「書き込み」セクションの修正されたコードは次のとおりです。

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

c++ - C ++でstd::memory_orderによって正確に提供されるフェンスはどれですか?

私が知っているように、 std::memory_order 列挙型はメモリフェンスを提供しますが、各 std::memory_order 列挙型要素によって提供されるフェンスについて確認する必要があります。以下では、std::memory_order 列挙要素のそれぞれを理解しているので説明します。

  1. std::memory_order_relaxed - フェンスが提供されていません
  2. std::memory_order_acquire - LoadLoad_LoadStore
  3. std::memory_order_release - LoadStore_StoreStore
  4. std::memory_order_consume - 通常は memory_order_acquire に等しい
  5. std::memory_order_acq_rel - LoadLoadLoadStore_LoadStoreStoreStore ???
  6. std::memory_order_seq_cst - StoreLoad_StoreLoad ???

最初の 4 つの要素については、よくわかりません。しかし、最後の 2 つの要素については、何もわかりません。

それについて正確に知っている人はいますか?

また、std::atomic または std::atomic_flag を使用する場合、コンパイラがメモリ フェンスを配置する場所を知る必要がありますか?

私が理解しているように、アトミックでフェンスを使用することは、フェンスを適用して操作を実行することを意味します。私は正しいですか?例えば:

memory_order_acquire フェンスを適用し、データをアトミックにロードすることを意味しますか?