C# 是';锁';占用CPU时间?

C# 是';锁';占用CPU时间?,c#,.net,clr,C#,.net,Clr,我有6条线。 其中一个线程进入某个作用域并打开“锁”,而另一个线程则打开所有锁 线程正在等待并希望进入相同的作用域 现在,其他线程将获得CPU时间吗?其他线程是否在线程计划中? 我知道所有其他线程都处于等待状态,但CPU将尝试使线程继续并尝试进入作用域(即使该作用域不可访问)当尝试输入已被锁定的锁时,线程首先自旋锁定一段时间,最后挂起并进入等待状态 它们在旋转时仍然会消耗CPU时间,但在等待时就不会了。锁不是这样工作的。你不会给任何人更多的“cpu时间”。如果要锁定,则可能会在线程彼此等待的位置

我有6条线。 其中一个线程进入某个作用域并打开“锁”,而另一个线程则打开所有锁 线程正在等待并希望进入相同的作用域

现在,其他线程将获得CPU时间吗?其他线程是否在线程计划中?
我知道所有其他线程都处于等待状态,但CPU将尝试使线程继续并尝试进入作用域(即使该作用域不可访问)

当尝试输入已被锁定的锁时,线程首先自旋锁定一段时间,最后挂起并进入等待状态


它们在旋转时仍然会消耗CPU时间,但在等待时就不会了。

锁不是这样工作的。你不会给任何人更多的“cpu时间”。如果要锁定,则可能会在线程彼此等待的位置引入等待期和潜在的死锁。

我的理解是,其他线程仍将接收时间片,它们将使用时间片检查锁的状态。如果锁仍在,他们将返回睡眠,否则他们将继续。这也是我理解的-但这需要CPU时间。。。所以这是一种繁忙的等待——这是非常糟糕的。稍微扩展一下:spinwait之所以被执行,是因为它比内核转换更便宜,因此在锁只是轻微争用的情况下会得到优化。什么是spinlock?你能用一句话回答吗?@Royi线程不断检查循环中的外观是否空闲。类似于
while(!lock.TryEnter()){}
的东西会消耗CPU,但可以避免内核转换和线程调度的开销。如果锁很快就可以释放,这是好的,但是如果需要更长的时间,这是坏的。这就是为什么
lock
spinlocks会短暂旋转一段时间,然后等待的原因。