私は最近、スレッド化されたメモリ管理、特にvolatile
キーワードの使用について、SO や他の場所で多くのことを読んでいます。私はこの概念にかなり自信を持ち始めていますが、その効果を十分に理解するために、それを説明するいくつかの実験を試して実行したいと思います.
ここに私のセットアップがあります:私はプロデューサースレッド(前の質問に関連してマイクからオーディオデータを読み取りますが、実際のデータは重要ではありません)を持っており、データをbyte[]
別のコンシューマースレッドとして渡します。スレッド間でデータが共有される方法は、私の実験の主な変数ArrayBlockingQueue
です。共有volatile byte[]
参照を試しました (このブログ投稿array = array
で推奨されている自己参照を使用)。また、自己参照のない通常の不揮発性も試しました。両方のスレッドは、進行中にデータをディスクに書き込みます。byte[]
私の希望は、ある程度の時間実行した後、不揮発性byte[]
バージョンでは、一部のメモリ書き込みが時間内に表示されないために、プロデューサーが共有しようとしたデータとコンシューマーがデータを読み取ったデータとの間に不一致があることを発見することでした。 、一方、他の 2 つのバージョンでは、メモリ書き込みの公開を確実にするために講じられた予防措置により、各スレッドによってログに記録されたデータがまったく同じになります。ただし、たまたま、どの方法を使用しても 100% の精度が得られます。
なぜこれが起こったのかについてはすでにいくつかの可能性を考えることができますが、私の主な質問は次のとおりです: 別のスレッドには見えない不揮発性変数への書き込みは、どのような条件下で行われるのvolatile
ですか? また、実験目的でこれらの条件を強制することはできますか?
これまでの私の考えは次のとおりです。
- 2 つのスレッドが同じコアで実行され、同じキャッシュを共有しているので、メモリの書き込みがすぐに表示されるのではないでしょうか?
- 多分CPU負荷が要因ですか?おそらく、問題が発生する前に、すべて異なることを行う多くのスレッドが必要ですか?
- もう少し待つ必要があるかもしれません: おそらくそのような問題は非常にまれですか?
そのような実験をどのように設計できるか、または私の考えに欠陥がある理由を説明できる人はいますか?
どうもありがとう。