問題タブ [memory-model]

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 に答える
315 参照

c++ - exchange または compare_and_exchange は変更順序の最後の値を読み取りますか?

Anthony Williams によるC++ Concurrency in Actionを読んでいます。セクション「リラックスした順序付けについて」には、次のように記載されています。

「この番号を書き留めて、リストの一番下にあったものを教えてください」(交換)、「一番下の番号がリストのそれはそれです; そうでなければ、私が何を推測すべきだったか教えてください」(compare_exchange_strong) が、それは一般原則には影響しません。

そのような操作は常に変更順序で最後の値を読み取ることを意味しますか (追加のスレッド間が制約の前に発生しない場合)? つまり、キャッシュの更新などがありますか (リラックスした順序であっても)?

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

c++ - 非アトミックオブジェクトはすべてのスレッドで同じ変更順序を持っていますか? (データ競合がない場合)

1.10/6:

特定のアトミック オブジェクト M に対するすべての変更は、M の変更順序と呼ばれる特定の全体的な順序で発生します。

非アトミックオブジェクトもすべてのスレッドで同じ変更順序を持っていますか? 適切に同期されたケース (データ競合がない場合など) に関心があります。

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

c++ - 空のクラス型のオブジェクトのメモリを使用する

空クラスのC++ではsizeof1バイトなので、以下のコードは有効でしょうか?

ほとんど役に立たないことはわかっていますが、これができるかどうかを確認したかっただけです。MSVC2010 では問題なくコンパイルおよび実行されます。

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

c++ - 取得/解放とシーケンシャル コンシステント メモリの順序

std::atomic<T>T がプリミティブ型の場合:

操作、操作、および操作に盲目的に使用する場合std::memory_order_acq_rel(これらの関数のデフォルトのメモリ順序をリセットするのと同じことを意味します)fetch_xxxstd::memory_order_acquireloadstd::memory_order_releasestore

  • std::memory_order_seq_cst結果は、宣言された操作のいずれかに使用した場合 (デフォルトとして使用されています)と同じになりますか?
  • std::memory_order_seq_cst結果が同じだった場合、この使用法は効率の点で使用法とは何か違いますか?
0 投票する
4 に答える
904 参照

c++ - shared_ptr デストラクタ内の実装エラーに関する混乱

Herb Sutter の講演: C++ and Beyond 2012: Herb Sutter - atomic<> Weapons, 2 of 2

彼は std::shared_ptr デストラクタの実装にバグを示しています:

彼は、memory_order_relaxed により、delete を fetch_sub の前に配置できると述べています。

1:25:18 - 離すとライン B が本来あるべき位置に維持されない

それはどのように可能ですか?どちらもシングルスレッドであるため、事前発生/事前シーケンスの関係があります。私が間違っているかもしれませんが、fetch_sub と delete の間にも Carry-a-dependency-to があります。

彼が正しければ、どの ISO 項目がそれをサポートしていますか?

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

x86 - x86 マイクロプロセッサーのメモリー制限

私は最近、オンライン リソースからコンピューター アーキテクチャのコースを開始しました。私が手に取った本の 1 つを読んだところ、x86 プロセッサには 32 のアドレス行があり、データ バス上で一度に 4 バイトのデータを読み取ることができることがわかりました。これで、アドレス行が 32 行あると、アドレス指定可能なメモリが 40 億の一意のアドレスに制限されることがわかりました。私が頭を悩ませているのは、CPU が各サイクルで 40 億の一意のアドレスのそれぞれから 4 バイトのデータを読み取ることができる場合、x86 システムの RAM が 4 GB に制限される理由です。代わりに 16 GB (4 GB の 4 倍) であるべきではありませんか? 誰かが私のためにこれを片付けてもらえますか? また、32 ビットまたは 64 ビットのマイクロプロセッサについて話すとき、32/64 は CPU のアドレス ラインの数またはデータ ラインの数を指しますか? (私の最初の質問については、おそらく私は

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

c++ - C++11 標準の消費操作とは何ですか?

取得、解放、消費などに関するこの質問が存在することを見てきましたが、「消費操作」が実際に何であるかを実際に定義する答えはありません。

1.10 パラグラフ 5 では、次のように述べています。

1 つ以上のメモリ ロケーションに対する同期操作は、消費操作、取得操作、解放操作、または取得操作と解放操作の両方のいずれかです。

C++11 標準のセクション 1.10 で使用されているため、誰かがこれが何であるかを説明できるかどうか疑問に思いましたか?

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

c++ - std::mutex に関するセマンティクスの解放/取得

私は n3485 で定義された C++ メモリ モデルを読んでいます。これは、私が理解していることと、このブログで提供されている定義から解放/取得セマンティクスについて語っています。

取得セマンティクスは、読み取り-変更-書き込み操作であろうと単純なロードであろうと、共有メモリから読み取る操作にのみ適用できるプロパティです。この操作は読み取り取得と見なされます。取得セマンティクスは、プログラム順でそれに続く読み取りまたは書き込み操作での読み取り/取得のメモリの並べ替えを防止します。

リリース セマンティクスは、共有メモリに書き込む操作にのみ適用できるプロパティであり、それらが読み取り-変更-書き込み操作であるかプレーン ストアであるかに関係ありません。この操作は、書き込み解放と見なされます。解放セマンティクスは、プログラム順で先行する読み取りまたは書き込み操作による書き込み解放のメモリの並べ替えを防ぎます。

現在の読み取り/書き込みが行われる前または後の読み取り/書き込みの並べ替えを防止します。最初の (取得) は、現在行われている読み取りがその後の読み取り/書き込みで並べ替えられていないことを確認し、後者 (リリース) は、現在の書き込みが前の読み取り/書き込み操作で並べ替えられていないことを確認します。それ。

はセマンティクスを取得し、本質的に解放std::mutex::lockセマンティクスを持っていると言えますか?std::mutex::unlock

標準では、セクションの下でこれを見つけることができます

30.4.1.2 ミューテックス型 [thread.mutex.requirements.mutex]

unlock()11 同期:同じオブジェクトに対する以前の操作は、 (1.10) この操作と同期する必要があります。

私が理解していることから、同期は標準で明示的に定義されていませんが、 2つの異なるスレッド間で評価される2つのステートメントを見ると、関係の前に発生するタイプのようですが、取得/解放セマンティクスの私の理解から、これにはもっと多くのことがありますメモリの並べ替えに関係します。 同期はリリース/取得セマンティクスとも呼ばれますか?

リリース/取得セマンティクスは、ロード/ストア操作の並べ替えだけでなく、操作のスレッド内インターリーブにも適用されますか?

メモリモデルに関する標準的なセクションでは、主に 2 つのスレッドのインターリーブに関する順序付けられた関係について説明しています。これがメモリの順序付けにも適用されるかどうかについては、解釈の余地があります。

誰でも明確にできますか?

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

verilog - どうすればマルチプレクサのサイズを減らすことができますか

これは、メモリ モジュール設計用の簡単な Verilog コードです (コードをより効率的にしたい)

また、data_output[0:7]= memory[address][0:7];と書き込むと、8X1マルチプレクサを作成します

書くことによって

私はマルチプレクサのサイズを減らしていますか?

;