Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
监视器类是通过旋转(用户模式)还是停止线程(内核模式)在C#块中运行的?_C#_Multithreading_Synchronization_Monitor_Kernel Mode - Fatal编程技术网

监视器类是通过旋转(用户模式)还是停止线程(内核模式)在C#块中运行的?

监视器类是通过旋转(用户模式)还是停止线程(内核模式)在C#块中运行的?,c#,multithreading,synchronization,monitor,kernel-mode,C#,Multithreading,Synchronization,Monitor,Kernel Mode,监视器类是通过旋转(用户模式)还是停止线程(内核模式)在C#块中运行的 我在一本书中找不到这个问题的答案 我清楚地了解监视器如何与对象交互。它使用CLR创建的同步块数组,只操作对象的同步块字段以指向特定的同步块。然后,sync块将包含获取锁的线程的id,递归计数(线程获取锁的次数)。并且监视器.Enter将阻止其他线程,直到递归计数为0 但我不明白阻塞将如何发生。被阻止(等待)的线程是否会转换到内核模式并停止,还是只是在浪费CPU?您似乎可以通过创建两个线程并让它们在不可用的对象上等待(Moni

监视器类是通过旋转(用户模式)还是停止线程(内核模式)在C#块中运行的

我在一本书中找不到这个问题的答案

我清楚地了解监视器如何与对象交互。它使用CLR创建的同步块数组,只操作对象的同步块字段以指向特定的同步块。然后,sync块将包含获取锁的线程的id,递归计数(线程获取锁的次数)。并且
监视器.Enter
将阻止其他线程,直到递归计数为0


但我不明白阻塞将如何发生。被阻止(等待)的线程是否会转换到内核模式并停止,还是只是在浪费CPU?

您似乎可以通过创建两个线程并让它们在不可用的对象上等待(
Monitor.Enter
)来测试这一点,并查看您的CPU使用情况;我怀疑它会做一些推测,然后放弃并转换到内核等待,但最终它是一个实现细节——至少在.NET Framework中,它们都是对运行时的
InternalCall
;.NET Core的实现应该可以在github上使用,不过.NET Core和Mono也可以:/;看起来它是由VMIt中的JIT_MonEnter实现的,在调用内核之前,它先旋转一小段时间。再加上Skylake CPU上的暂停时间增加,造成了这样一种假设,即大多数锁要么是无争用的,要么是短时间内有争用的。谢谢大家的见解。:)您似乎可以通过创建几个线程来测试这一点,并让它们在不可用的对象上等待(
Monitor.Enter
),然后查看您的CPU使用情况;我怀疑它会做一些推测,然后放弃并转换到内核等待,但最终它是一个实现细节——至少在.NET Framework中,它们都是对运行时的
InternalCall
;.NET Core的实现应该可以在github上使用,不过.NET Core和Mono也可以:/;看起来它是由VMIt中的JIT_MonEnter实现的,在调用内核之前,它先旋转一小段时间。再加上Skylake CPU上的暂停时间增加,造成了这样一种假设,即大多数锁要么是无争用的,要么是短时间内有争用的。谢谢大家的见解。:)