質問

100 バイトで構成される構造体があるとします。次のコードについてはどのような保証がありますか?

m_myLargeStruct = someValue; // copying 100 bytes
Thread.MemoryBarrier();

// Executed by another thread, after "Thread.MemoryBarrier" was called by the first thread
Console.WriteLine(m_myLargeStruct.ToString());

メモリ モデルは、メモリ バリアの配置後に 100 バイトのコピーが完了することを保証しますか?それともメモリバリアはプロセッサのアーキテクチャのサイズの型にのみ適用されますか?(32 ビットの場合は 4 バイト、64 ビットの場合は 8 バイト)。
これが理由ですか? 揮発性の キーワードはプリミティブ型にのみ適用されますか?(8 バイトのメンバーを volatile として宣言すると、その値を変更するためにインターロックされた命令が使用されることになります。[32 ビット マシンでは 4 バイトを超える型についてはアトミック性が保証されないため])。

十分に明確だったと思いますが..:)
ありがとう

役に立ちましたか?

解決

明らかに答えはいいえではない、というか、あなたは何について何の保証もありません。何も100バイトの構造体をプリントアウトスレッドを開始する前に、100バイトの構造体への書き込みをしているスレッドをスワップアウトからオペレーティングシステムを妨げません。

あなたはフラグまたは他のいくつかの原子値を介してデータへのアクセスを調整したいときに、メモリバリアが使用されています。私はあなたがやろうとしている内容を正確に把握していないので、私はあなたがそれを行うべきかについての良い例のコードを与えることはできません。

他のヒント

読み取りスレッドにもメモリバリアがない限り、そうではありません。 考える それはとても役に立ちます。

個人的には次のようなことは避けたいと思います。

  • それほど大きな構造物
  • メモリ モデルを深く理解してロックフリーのコードを作成する

...そうする本当に重要な理由がない限り。その とても 可変データを使用してロックフリーのコーディングを正しく行うのは困難です。専門家でも苦労していると思います。私は通常、「データにアクセスするブロックごとにロックアウトする」アプローチの方が簡単に正しく実行でき、99% のケースでパフォーマンスの点で問題ないと思います。

私は Microsoft の PFX チームがロック フリー コーディングを適切に実行し、彼らのコードを使用して独自のロック フリー プログラムを比較的簡単に作成できる方法を提供してくれると信頼しています。私はこの種のことを正しく理解できる自信がありません。明示的にメモリ バリアを使用する必要がある場合は、おそらく頑張りすぎていることを意味します。

あなたはWriteLineメソッドの前に、第二のスレッド内の別のメモリバリアを必要としています。 (お使いのシステムは、非対称メモリバリアを提供する場合、それは割り当て後のリリース障壁とWriteLineメソッドの前に獲得バリアを実行するだけで十分です)。

データサイズは関係ありません。

最初のスレッドの前に「実行」を取得していないあなたは、両方の場所/スレッド内のメモリバリアを必要とする、そしてもちろん、あなたは2つのので、第二のスレッドのバリア間の同期のいくつかの並べ替えを必要とする。

は、具体的には、書き込みスレッドが「解放」メモリバリアを必要とし、読み取りスレッドが「取得」メモリバリアを必要とする(基礎となるプラットフォームは別個バリアセマンティクスをサポートしている場合)。

あなたは学術的好奇心の外に求めているか、あなたがあなた自身のフレームワークを書いている場合を除き、あなたは本当にただのライブラリ/フレームワーク/プラットフォームから同期オブジェクトを使用する必要があります。すべてこのようなものが正しい取得しようとすると、トリッキーであり、それは、すでに提供さシンクオブジェクトに行われています。

さて、まず第一に、あなたは大きなことである構造体を持つべきではありません。あなたは、構造体を使用する方法については非常に慎重でない限り、それはクラスを使用するよりも遅くなります。また、それは構造体の値のセマンティクスに直感的です。

つまり、メモリバリアが構造体がコピーされることを保証する、と述べました。最適化は、障壁を超えてすべての指示に移動しません。

volatileキーワードは少し異なっています。これは、変数に対して何も操作が離れて最適化されていないことを保証し、それがメモリアクセスの順序を保証しません。しかし、アトミックにアクセスすることができないデータ型のために、それはあなたがまだ古い値の新しい値の半分ずつを読むことができるよう目的に糸を通すために、ほとんど役に立たないのです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top