問題タブ [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.
java - 「逐次一貫性のある実行にはデータ競合がない」とは何ですか?
JLSでは、§17.4.5。起こる-注文の前に、それはそれを言います
プログラムは、すべての逐次一貫性のある実行にデータ競合がない場合にのみ、正しく同期されます。
それは私たちに「逐次一貫性」についての定義を与えるだけであり、「逐次一貫性のある実行」についての定義を私たちに与えません。「逐次一貫性のある実行」とは何かを知って初めて、このトピックについてさらに議論することができます。
では、「逐次一貫性のある実行」とは何であり、「逐次一貫性のある実行にはデータの競合がない」とは何でしょうか。
java - Java メモリ モデルでのデータ競合を伴う正しく同期されたプログラムの例
JLSでは、§17.4.5。Happens-before Order、それは言う
プログラムが正しく同期されるのは、すべての連続した一貫した実行にデータ競合がない場合のみです。
正しく同期されたプログラムはまだデータ競合を許可しますか?(パート I) の議論によると、次の結論が得られます。
プログラムが正しく同期され、データ競合が発生する可能性があります。
2 つの結論の組み合わせは、次のような例が存在する必要があることを意味します。
プログラムのすべての順次一貫性のある実行にはデータ競合がありませんが、そのようなプログラムの通常の実行 (順次一貫性のある実行以外の実行) にはデータ競合が含まれます。
よく考えてみましたが、そのようなコード サンプルはまだ見つかりません。あなたは?
java - 正しいプログラムが正しく同期されていない可能性がありますか?
正しく同期されたプログラムはまだデータ競合を許可しますか?(パートI)の答えとして、それは良い例を示しています:プログラムのすべての実行は順次一貫しているように見えますが、それでもデータ競合があります。これは、 JLSで結論に従う別の方向が正しくない理由を示しています。
プログラムにデータ競合がない場合、プログラムのすべての実行は順次一貫しているように見えます。
次に、 JLSの別の結論を見てみましょう。
プログラムは、すべての逐次一貫性のある実行にデータ競合がない場合にのみ、正しく同期されます。
この結論によると、上記の例は正しく同期されていないので、正しいプログラムが正しく同期されていない可能性がありますか?
java - JLSに含まれる保証を適用できないのはなぜですか?
メーリングリストから、揮発性変数に対するアクションにデータ競合が含まれている場合、保証( JLSの「すべての逐次一貫性のある実行にデータ競合がない場合にのみプログラムが正しく同期される」)を適用できないというメールを受け取りました。
便宜上、元のコンテンツの一部をここに配置します。
私は揮発性変数を使用するプログラムを持っており、「プログラムは、すべての逐次一貫性のある実行にデータ競合がない場合にのみ正しく同期される」を使用して推論しようとしています。JLS3での保証。
JLS3には、プログラムにデータ競合がないことを証明できない不具合が含まれているようです。具体的には、揮発性変数Vの読み取りRと、同期順序でRの後に続くVの書き込みWについて考えます。JLS3は、RとWが競合するアクセスであると見なしているようです。さらに、RからWへのエッジの前に発生することはありません(そして当然のことながら)。したがって、JLS3はRとWもデータ競合を構成すると見なしているようです。最後になりますので、上記の保証は適用できないようです。
だからこれが私の質問です:揮発性変数に対するアクションにデータ競合が含まれている場合、なぜJLSに含まれる保証を適用できないのですか?
java - 決して起こらないかもしれない並べ替え
正しく同期されたプログラムはまだデータ競合を許可しますか?(パートI)での議論では、 2つの非常に良い例があります。
2つ目について話したいだけです。便宜上、ここに2番目の例を示します。
発生前の関係の定義の最初の項目によると、xとyが同じスレッドのアクションであり、プログラムの順序でxがyの前にある場合、hb(x、y)、次の結論が得られる可能性があります。
hb((1)、(2))とhb((2)、(3))があるため、hb((1)、(3))です。
なぜなら:
ハッシュは共有変数です。
(1)、(2)、(3)はすべて同じスレッドのアクションです。
プログラム順に、(1)が(2)の前に、(2)が(3)の前に来る。
さて、私の質問に戻りましょう。(1)と(3)の間に起こる前の関係がある場合、(1)と(3)は決して並べ替えるべきではありません。
私の説明に誤解はありますか?あなたの意見はどうですか?
c++ - C ++ 11メモリモデルに関する奇妙な結果(リラックスした順序)
AnthonyWilliamsの本「C++Concurrency」のメモリモデルで例をテストしていました
説明によると、差分変数(ここではxとy)の緩和された操作は自由に並べ替えることができます。しかし、私は問題を数日以上繰り返し実行しました。アサーション(assert(z.load()!= 0);)が発生する状況に遭遇したことはありません。デフォルトの最適化を使用し、g ++ -std = c ++ 11 -lpthread dataRaceAtomic.cppを使用してコードをコンパイルします。誰かが実際にそれを試し、アサーションをヒットしますか?誰かが私のテスト結果について説明してもらえますか?ところで、アトミックタイプを使わないバージョンも試してみましたが、同じ結果になりました。現在、両方のプログラムは正常に実行されています。ありがとう。
c++ - memory_order_seq_cst と memory_order_acq_rel の違いは?
どちらも、ストアはリリース操作であり、ロードは取得操作です。すべての操作に追加の合計順序を課すことを意図していることは知っていますが、すべてが に置き換えられmemory_order_seq_cst
た場合にそうではない例を作成できていません。memory_order_seq_cst
memory_order_acq_rel
私は何かを見逃していますか、それとも違いは単なるドキュメンテーション効果です。つまりmemory_order_seq_cst
、よりリラックスしたモデルで遊ぶつもりがない場合に使用memory_order_acq_rel
し、リラックスしたモデルを制約するときに使用する必要がありますか?
c++ - 各memory_orderはどういう意味ですか?
私は章を読みましたが、あまり好きではありませんでした。各メモリの順序の違いはまだわかりません。これは、はるかに単純なhttp://en.cppreference.com/w/cpp/atomic/memory_orderを読んだ後に理解した私の現在の推測です。
以下は間違っているので、そこから学ぼうとしないでください
- memory_order_relaxed:同期しませんが、別のアトミック変数の別のモードから注文が行われた場合は無視されません
- memory_order_consume:このアトミック変数の読み取りを同期しますが、これより前に書き込まれた緩和された変数は同期しません。ただし、スレッドがYを変更するときにvar Xを使用する(そしてそれを解放する)場合。Yを消費する他のスレッドでは、Xもリリースされますか?これがこのスレッドがx(そして明らかにy)の変更をプッシュすることを意味するかどうかはわかりません
- memory_order_acquire:このアトミック変数の読み取りを同期し、これが同期される前に書き込まれた緩和された変数を確認します。(これは、すべてのスレッドのすべてのアトミック変数が同期されることを意味しますか?)
- memory_order_release:アトミックストアを他のスレッドにプッシュします(ただし、consum / acquireで変数を読み取る場合のみ)
- memory_order_acq_rel:読み取り/書き込み操作用。古い値を変更せず、変更を解放するように取得します。
- memory_order_seq_cst:更新を他のスレッドで強制的に表示することを除いて、acquire releaseと同じです(
a
別のスレッドでrelaxedで保存する場合。seq_cstで保存b
します。relaxで3番目のスレッドを読み取ると、他のアトミック変数a
とともに変更が表示されますか?b
)。
私は理解したと思いますが、間違っている場合は訂正してください。読みやすい英語でそれを説明するものは何も見つかりませんでした。
c++ - 自明でないコピー可能型の値表現
私は、標準 ( ISO/IEC 14882:2011(E)の§3.9/4) の次の段落に興味をそそられます。
type のオブジェクトのオブジェクト表現は、 typeのオブジェクトによって取り上げられるN 個
T
のオブジェクトのシーケンスです。ここで、Nは等しいです。オブジェクトの値表現は、 type の値を保持するビットのセットです。自明にコピー可能な型の場合、値の表現は、実装定義の値のセットの 1 つの離散要素であるvalueを決定するオブジェクト表現のビットのセットです。42unsigned char
T
sizeof(T)
T
オブジェクト表現の一部がオブジェクトの値に関与しないようにするために、オブジェクト表現と値表現が異なることを理解しています (パディングなど)。ただし、自明にコピー可能な型についてはよくわかりません。自明ではないコピー可能な型には値がありませんか? 自明でないコピー可能型の値表現の一部は、そのオブジェクト表現の外に存在できますか?
注42は次のように説明しています。
その意図は、C++ のメモリ モデルが ISO/IEC 9899 プログラミング言語 C のメモリ モデルと互換性があることです。
ただし、前のステートメントが単純にコピー可能な型のみを対象としている理由はまだわかりません。これにはどのような意味がありますか?
c++ - C11/C++11 メモリ モデル
2 つの質問があります。
C++11 と C11 の標準が同じメモリ モデル仕様を共有するかどうかを知りたいです。私はこれがそうであるように、実際にC11はC++ 11メモリモデルを「継承」していると読んだ(歴史的な理由が何であれ、後者は最初に、または同時に/同じ人々で起こった.主に C++ の担当者が、言いたいことがたくさんありました。
私の次の質問は、GCC がこのメモリ モデルを実装することはあるのでしょうか? 私はこれのロードマップを見ていないので、誰かが「スクープ」を持っているかどうか疑問に思っていました.