これが私の主題に対する私の見解であり、1つの回答で準完全なリストを提供しようとしています. 他の人に出くわした場合は、時々回答を編集します。
暗黙の障壁を引き起こすと一般的に合意されているメカニズム:
Monitor
C# キーワードを含むすべてのクラス メソッドlock
- すべての
Interlocked
クラス メソッド。
- すべての
Volatile
クラス メソッド (.NET 4.5+)。
- とを含むほとんどの
SpinLock
メソッド。Enter
Exit
Thread.Join
Thread.VolatileRead
とThread.VolatileWrite
Thread.MemoryBarrier
volatile
キーワード。
- 、 、、コンパイラ提供のメソッドなどを含む
QueueUserWorkItem
、スレッドを開始するか、デリゲートを別のスレッドで実行させるもの。Task.Factory.StartNew
Thread.Start
BeginInvoke
ManualResetEvent
、AutoResetEvent
、CountdownEvent
、Semaphore
、などのシグナリング メカニズムの使用Barrier
。
Control.Invoke
、Dispatcher.Invoke
、SynchronizationContext.Post
などのマーシャリング操作の使用。
暗黙の障壁を引き起こすと推測されている (ただし確実には知られていない) メカニズム:
Thread.Sleep
(メモリバリアの問題を示すコードはこの方法で修正できるという事実により、私自身とおそらく他の人によって提案されました)
Thread.Yield
Thread.SpinWait
Lazy<T>
LazyThreadSafetyMode
どちらが指定されているかによって
その他の注目すべき言及:
lock
orを使用するため、C# のイベントのデフォルトの add および remove ハンドラInterlocked.CompareExchange
。
- x86 ストアにはリリース フェンスのセマンティクスがあります
- Microsoft の CLI の実装には、ECMA 仕様で義務付けられていないにもかかわらず、書き込みに対するリリース フェンス セマンティクスがあります。
MarshalByRefObject
暗黙のメモリバリアが存在するかのように見えるサブクラスの特定の最適化を抑制しているようです。これを発見し、注意を喚起してくれたHans Passantに感謝します。1
1これは、プロパティの基礎となるフィールドがなくても正しく機能する理由を説明しています。BackgroundWorker
volatile
CancellationPending