27

Joseph Albahari の threading tutorialを読むと、メモリバリアの生成元として次のことが言及されています。

  • C# のlockステートメント ( Monitor.Enter/ Monitor.Exit)
  • Interlockedクラスのすべてのメソッド
  • スレッド プールを使用する非同期コールバック — これらには、非同期デリゲート、APM コールバック、およびタスクの継続が含まれます。
  • シグナリング構造の設定と待機
  • タスクの開始や待機など、シグナル伝達に依存するものすべて

さらに、Hans Passant と Brian Gideonは次のことを追加しました(いずれも前のカテゴリのいずれにも当てはまらないと仮定します)。

  • スレッドの開始またはウェイクアップ
  • コンテキスト スイッチ
  • Thread.Sleep()

私はこのリストが完全であるかどうか疑問に思っていました (完全なリストを実際に作成することさえできれば)

編集の追加が提案されました:

  • 揮発性 (読み取りは取得フェンスを意味し、書き込みは解放フェンスを意味します)
4

3 に答える 3

38

これが私の主題に対する私の見解であり、1つの回答で準完全なリストを提供しようとしています. 他の人に出くわした場合は、時々回答を編集します。

暗黙の障壁を引き起こすと一般的に合意されているメカニズム:

  • MonitorC# キーワードを含むすべてのクラス メソッドlock
  • すべてのInterlockedクラス メソッド。
  • すべてのVolatileクラス メソッド (.NET 4.5+)。
  • とを含むほとんどのSpinLockメソッド。EnterExit
  • Thread.Join
  • Thread.VolatileReadThread.VolatileWrite
  • Thread.MemoryBarrier
  • volatileキーワード。
  • 、 、、コンパイラ提供のメソッドなどを含むQueueUserWorkItem、スレッドを開始するか、デリゲートを別のスレッドで実行させるもの。Task.Factory.StartNewThread.StartBeginInvoke
  • ManualResetEventAutoResetEventCountdownEventSemaphore、などのシグナリング メカニズムの使用Barrier
  • Control.InvokeDispatcher.InvokeSynchronizationContext.Postなどのマーシャリング操作の使用。

暗黙の障壁を引き起こすと推測されている (ただし確実には知られていない) メカニズム:

  • Thread.Sleep(メモリバリアの問題を示すコードはこの方法で修正できるという事実により、私自身とおそらく他の人によって提案されました)
  • Thread.Yield
  • Thread.SpinWait
  • Lazy<T>LazyThreadSafetyModeどちらが指定されているかによって

その他の注目すべき言及:

  • lockorを使用するため、C# のイベントのデフォルトの add および remove ハンドラInterlocked.CompareExchange
  • x86 ストアにはリリース フェンスのセマンティクスがあります
  • Microsoft の CLI の実装には、ECMA 仕様で義務付けられていないにもかかわらず、書き込みに対するリリース フェンス セマンティクスがあります。
  • MarshalByRefObject暗黙のメモリバリアが存在するかのように見えるサブクラスの特定の最適化を抑制しているようです。これを発見し、注意を喚起してくれたHans Passantに感謝します。1

1これは、プロパティの基礎となるフィールドがなくても正しく機能する理由を説明しています。BackgroundWorkervolatileCancellationPending

于 2011-08-03T19:39:28.207 に答える
12

Thread.VolatileRead および Thread.VolatileWrite メソッドの実装は、実際にはハーフ フェンスではなくフル フェンスを引き起こすことを思い出すようです。

人々が無意識のうちにこの動作に依存するようになった可能性があるため、これは非常に残念です。フル フェンスを必要とするプログラムを作成したり、ハーフ フェンスが必要だと考えたり、ハーフ フェンスを取得していると考えたりし、これらのメソッドの実装がハーフ フェンスを提供する場合、厄介な驚きに遭遇する可能性があります。

私はこれらの方法を避けます。もちろん、ローロック コードに関係するものはすべて避けるでしょう。

于 2011-07-05T15:41:36.070 に答える
3

キーワードはvolatileメモリ バリアとしても機能します。http://blogs.msdn.com/b/brada/archive/2004/05/12/130935.aspxを参照してください。

于 2011-07-05T11:39:56.467 に答える