3

アプリ全体で 1 つのメソッドだけが特定の変数に書き込むことを保証できる場合、アプリ内の他のメソッドがその値を安全に読み取れるようにすることはできますか?

もしそうなら、変数をロックせずにスタントを回避できますか?

このコンテキストでは、私がやっていること (または、やろうとしている、またはやりたいこと) は、あるスレッドの 1 つのメソッドが変数に値を入れ、他のスレッドの他のメソッドがその値を読み取って決定を下すことです。 .

非常に優れたオプションは、読み取りを許可しながら、書き込みに対してロックすることです。

ここでMSDNページをロックして見ましたが、それを行う方法がわかりませんでした。

4

1 に答える 1

12

いつものように、それは文脈に大きく依存します。

  • タイトなループで読み取られた変数は、レジスタまたはローカル キャッシュに格納される可能性があるため、「フェンス」がない限り変更は認識されません。volatileこれを修正しますが、明示的な意図によるものではなく、副作用としてです。volatile ほとんどの人 (私を含む) は、意味を適切に定義することができません。
  • 特大の型 (大きな構造体) は (読み取りまたは書き込みのいずれについても) アトミックではなく、ティアリングのリスクなしに安全に処理することはできません
  • オブジェクトまたは値には、複数のサブ値が含まれる場合があります。それらがアトミックに変更されない場合、問題が発生する可能性があります

ただし、を必要とせずにほとんどの問題を解決できる場合あります。同時に、競争されていないものは非常に速く、競争されているものでも驚くほど速い. 率直に言って、それがあなたの考えに値するかどうかはわかりません: フラットはほぼ確実に十分に高速です. .Interlockedlocklocklocklocklocklock

ありますがReaderWriterLockSlim、それが実際にパフォーマンスを向上させるケースの数はわずかです。私の経験では、可能な最も単純なアプローチが通常最速であり、または のいずれlockかを意味しますInterlockedReaderWriterLockSlimは、より複雑なシナリオ向けに設計された、より複雑な獣であり、そのためにオーバーヘッドが少しあります。大量ではありませんが、注意深く見る価値があるほどの量です。

于 2013-01-07T21:47:39.710 に答える