阅读Joseph Albahari的线程教程,以下内容是内存障碍的产生者:
lock
Monitor.Enter
Monitor.Exit
Interlocked
此外,Hans Passant和Brian Gideon 添加了以下内容(假设其中一个都不属于先前的类别之一):
Thread.Sleep()
我想知道这份清单是否完整(如果可以实际制作出完整的清单)
编辑 建议:
这是我对这个问题的看法,并试图在一个答案中提供一个准完整清单。如果遇到其他问题,我将不时编辑我的答案。
普遍认为会引起隐性障碍的机制:
Monitor
Volatile
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
其他值得注意的提及:
Interlocked.CompareExchange
MarshalByRefObject
1 这说明了为什么BackgroundWorker不用属性volatile的基础字段即可正确工作的原因CancellationPending。
BackgroundWorker
CancellationPending