1) HandleProcessCorruptedStateExceptionsAttribute
这是CLR4.0的东西,在程序中会有一些"超级"异常,是指操作系统提出的未捕获异常,这些异常无法被普通的catch捕获,如果想要catch可以捕获这些异常,只要给catch所在方法打上这个标签就可以了。
2) Thread.BeginCriticalRegion(); Thread.EndCriticalRegion();
在这个代码区域中的错误不仅仅影响到本线程,因此这个区域的异常如果不被捕获就可能宿主会卸载AppDomain。比如在读写锁中就用到了这个。
3) [MethodImpl(MethodImplOptions.Synchronized | MethodImplOptions.NoInlining)]
void SomeMethod(string str)
这个属性大家一看都知道说的是什么意思,需要注意的是什么时候用MethodImplOptions.NoInlining。NoInlining,也就是要保持函数调用堆栈。
4) Thread.MemoryBarrier();
只有在弱顺序多处理器系统(例如,使用多个 Intel Itanium 处理器的系统)上 MemoryBarrier 才是必需的。防止代码的执行顺序被多处理器优化导致颠倒。加上这一行之后,barrier前面部分的代码一定会在barrier后面部分的代码执行前执行完。
3,4的例子可以看System.Threading.Thread.VolatileWrite/VolatileRead系列方法。
5)基本的同步锁有两种,自旋锁和信号量。
自旋锁就是用一个空循环来阻止线程,等待其他线程释放资源。
而信号量需要用到系统中断,会切换线程上下文,开销极大。
clr的典型应用在读写锁里面,首先用自旋锁,如果迟迟不能获得执行权限则会升级为信号量。