C# 中的那些锁,在内核态都是怎么保证同步的?( 二 )


从代码中可以看到,命中的是函数,也就是我们用户态代码的 mre.Reset(); 函数,如果大家感兴趣,可以挖一下它的汇编代码,很清楚的看到这个方法中有一些 lock 语句,所以性能上会所有下降哈 。
3.
要说 Event 事件锁维护的是 bool 变量,那就属于 int 变量了,为了方便说明继续上一个例子,观察方式和 Event 基本一致 。
internal class Program{static Semaphore semaphore = new Semaphore(10, 20);static void Main(string[] args){Console.WriteLine("handle=" + semaphore.Handle.ToString("x"));for (int i = 0; i < 100; i++){semaphore.WaitOne();Console.WriteLine($"{i}:已减少 1,请观察");Console.ReadLine();}Console.ReadLine();}}
接下来用进入到本机内核态观察 =270 所对应的 内核地址。
从图中可以非常清楚的看到这里的数字在不断的减小,其实想也能想到,少不了一些 CPU 级 lock 锁在里面 。