2

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

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

4

5 に答える 5

10

読み取りスレッドにもメモリバリアがない限り、あまり役に立たないと思います。

個人的に私は遠ざかります:

  • そんなに大きい構造体
  • ロックフリーコードを書くためにメモリモデルに深く入り込む

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

私はマイクロソフトのPFXチームがロックフリーコーディングを正しく行うことを信頼しており、彼らのコードを使用して自分のロックフリープログラムを比較的簡単に作成する方法を提供してくれます。私はこの種のことを正しくすることを自分自身に信じていません。メモリバリアを明示的に使用する必要がある場合、それはおそらく私が一生懸命努力していることを意味します。

于 2009-11-13T17:37:24.817 に答える
2

WriteLine の前に、2 番目のスレッドに別のメモリ バリアが必要です。(システムで非対称メモリ バリアが提供されている場合は、割り当て後に Release バリアを実行し、WriteLine の前に Acquire バリアを実行するだけで十分です)。

データサイズは問いません。

于 2009-11-13T17:41:10.283 に答える
1

両方の場所/スレッドにメモリバリアが必要です。もちろん、2番目のスレッドのバリアが最初のスレッドの前に「実行」されないように、2つの間に何らかの同期が必要です。

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

学術的な好奇心から質問している場合や、独自のフレームワークを作成している場合を除いて、実際には、ライブラリ/フレームワーク/プラットフォームの同期オブジェクトを使用する必要があります。これらすべてを正しくしようとするのは難しいことであり、提供されている同期オブジェクトですでに行われています。

于 2009-11-13T17:37:41.727 に答える
1

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

メモリバリアは、フラグまたはその他のアトミック値を介してデータへのアクセスを調整する場合に使用されます。あなたが何をしようとしているのか正確にはわからないので、あなたがそれをどのように行うべきかについての良いサンプルコードをあなたに与えることはできません。

于 2009-11-14T00:49:52.817 に答える
0

まず第一に、それほど大きな構造体を持つべきではありません。構造体の使用方法に細心の注意を払わない限り、クラスを使用するよりも遅くなります。また、構造体の値のセマンティクスに対して直感的ではありません。

そうは言っても、メモリバリアは構造体がコピーされることを保証します。最適化では、バリアを越えて命令が移動することはありません。

volatile キーワードは少し異なります。変数に対する操作が最適化されないことを保証し、メモリアクセスの順序を保証します。ただし、アトミックにアクセスできないデータ型の場合、新しい値の半分と古い値の半分を読み取ることができるため、スレッド化の目的にはほとんど役に立ちません。

于 2009-11-13T17:45:57.470 に答える