最近在看.netBCL入口的源码。我在System.Collections.Concurrent.ConcurrentQueue中看到一段有趣的代码。注意这段代码是写在ConcurrentQueue中的。并发排队。请注意,这是一个无锁队列的实现。最后尝试{}{newhigh=Interlocked.Increment(refm_high);如果(新高<=SEGMENT_SIZE-1){m_array[新高]=值;m_state[newhigh].m_value=true;}if(newhigh==SEGMENT_SIZE-1){增长();}}有趣吗?代码中使用了一个空的Try代码块。然后把所有的代码都写在Finally块中。这样做的目的是什么?这其实是一个小技巧:放在Finally中的代码可以防止执行线程在执行过程中被另一个调用Thread.Abort()或Thread.Interrupt()的线程打断。这确保了这段代码能够顺利完整地执行。例如:如果不把上面的代码放到Finally中运行。如果只有一个线程A正在执行,直到m_array[newhigh]=value;而另一个线程B调用线程A的Thread.Abort(),则m_array[newhigh]=value;以后的代码可能没有机会执行。那么就会造成ConcurrentQueue的不完整。并将代码放在最后,即使线程B调用了Thread。其实.netframework2.0就引入了这个特性。最后,在.net1.1中,它没有这个效果。此外,Tread.Abort可能会中断线程中静态构造函数的执行。另外我觉得用这个Thread.BeginCriticalRegion和Thread.EndCriticalRegion();也可以实现同样的功能。原文链接:https://img.ydisp.cn/news/20220914/gysmfdqa4ar.html
